2014-12-04 66 views
1

我有两个表。第一个表(Table1)用于获取记录,第二个表(Table2)用于插入第一个表记录。但得到结果后我有点困惑。SQL自动舍入值

在表1和表2列 “金额” 具有相同的数据类型,例如为nvarchar(最大)

表1

Id Amount 
1 Null 
2 -89437.43 
2 -533.43 
3 22403.88 

如果我运行此查询

Insert into Table2(Amount) 
Select Amount from Table1 

然后得到结果像这样,我不知道为什么值会自动舍入

Table2 

Id Amount 
1 Null 
2 -89437.4 
2 -533.43 
3 22403.9 
+2

这两个表中的列的数据类型是什么? – 2014-12-04 12:06:54

+0

您是否尝试过使用DECIMAL作为类型? – PKirby 2014-12-04 12:07:30

+0

@Greg'nvarchar(max)'它在问题中。不知道为什么数值存储在'nvarchar'字段中? – Tanner 2014-12-04 12:08:50

回答

2

SQL Server 转换回来和从字符串类型转换浮点值。
然后,你还要空字符串为0的乐趣位,以及其他奇怪的效果

SELECT CAST(CAST('' AS float) AS nvarchar(MAX)) 
SELECT CAST(CAST('0.E0' AS float) AS nvarchar(MAX)) 

使用十进制。

如果你需要存储“空白”(这如何从NULL有什么不同?)使用一个单独位列允许额外的价值

+0

我的金额列只存储7位数字,如1234567是123456.如何使用select查询存储超过7位数字。 – 2014-12-04 12:42:09

+0

不要截断它。你仍然有四舍五入的错误。 – gbn 2014-12-04 12:45:03

0

也许这是你的查询工具,现在已截断为8个字符。

检查的实际长度字段,看看问题是否真的是在数据库:

SELECT LEN(Amount) 
FROM Table2 
WHERE Amount LIKE '%-89437.%' 
+0

但是一个被截断为7.我很确定我们没有从OP得到完整的准确的故事。 – Paparazzi 2014-12-04 16:37:20

1

Here是你的问题很好的解释。

非此即彼你明确给出浮动或十进制或数字(XX,X)(X表示数值)

然后它会转换为数据,其他明智它四舍五入的最后一个值。

Insert into Table2(Amount) 
Select cast(Amount as numeric(18,2) --or , cast (Amount as float) 
from Table1 

检查此链接: - TSQL Round up decimal number

1

在我来说,我在做转换为正确的数据类型,但十进制(18,0)有在表中的列。因此,确保小数点位数正确表示为小数点(18,2)。