2013-02-25 30 views
0

我在尝试以下使用SQL Server 2008 R2和SQL Server 2012,并且在两者中都得到相同的结果。在SQL Server中四舍五入的错误

如果我写如下语句:

select round(4.005, 2) 

我得到预期的结果:4.01

但是,如果我写了下面的语句:

declare @result float 
select @result = 4.005 
select round(@result, 2) 

我得到了意想不到的结果: 4

但是如果我替换float真正在前面的语句:

declare @result real 
select @result = 4.005 
select round(@result, 2) 

我得到预期的结果。

谁能告诉我为什么会发生这种情况?

回答

0

这与float是一个近似的数据类型有关。

看到:http://technet.microsoft.com/en-us/library/ms187912(v=sql.105).aspx

浮子和真实的数据类型被称为近似数据类型。 float和real的行为遵循关于近似数值数据类型的IEEE 754规范。 近似数字数据类型不存储为许多数字指定的确切值;他们存储了一个非常接近的值。对于许多应用来说,指定值和存储的近似值之间的微小差异并不明显。有时候,差异变得明显。由于float和真实数据类型的近似性质,当需要精确的数字行为时(例如在财务应用程序中,涉及四舍五入的操作或平等检查中),不使用这些数据类型。而是使用整数,小数,金钱或smallmoney数据类型。 避免在WHERE子句搜索条件中使用浮点或实数列,特别是=和<>运算符。最好将float和real列限制为>或<比较。

IEEE 754规范提供了四种舍入模式:舍入到最近,舍入,舍入和舍入为零。 Microsoft SQL Server使用四舍五入。所有的都精确到保证的精度,但可能会导致浮点值略有不同。 由于浮点数的二进制表示可能使用许多合法舍入方案之一,因此不可能可靠地量化浮点值。

+0

现在有效,谢谢你的回应 – vcRobe 2013-02-25 19:27:21

1

因为你没有指定用于存储科学记数法float数的尾数位的数量,试试这个,

declare @result float(5) 
select @result = 4.005 
select round(@result, 2) 
+0

因为float(5)= real(这就是Books Online所说的),如果你没有指定值,那么它需要53作为默认值,所以如果你尝试任何大于24的值,它会失败。为什么? – vcRobe 2013-02-25 17:37:17