TSQL Round()不一致?

时间:2011-07-21 13:42:46

标签: tsql rounding

我们遇到的问题减少为以下两个陈述:

select convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)) as unrounded, round(convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)), 2)  as roundedTo2dp

select convert(float, 410.115) as unrounded, ROUND( convert(float, 410.115), 2) as roundedTo2dp

第一个语句使用浮点数来计算值410.115,以及使用round()到2个小数位的结果。舍入值出现在410.11。

第二个语句使用浮点值410.115并将其舍入到2个小数位。圆形结果为410.12。

为什么一个四舍五入,另一个四舍五入,当值四舍五入时呢?

如何才能将第一个声明转到410.12?

编辑:格式化道歉 - stackoverflow没有在这台机器上显示任何格式(非常奇怪)。

3 个答案:

答案 0 :(得分:5)

小数点精度比浮点数好。如果你改变了浮点数就像DECIMAL(18,2),你就会得到你期望的东西,而你不再需要调用圆函数了。

select convert(decimal(18,2), (convert(decimal(18,2),5741.61)/convert(decimal(18,2), 196.00)) * convert(decimal(18,2),14.00)) as unrounded, round(convert(decimal(18,2), (convert(decimal(18,2),5741.61)/convert(decimal(18,2), 196.00)) * convert(decimal(18,2),14.00)), 2)  as roundedTo2dp

结果

unrounded   roundedTo2dp
410.12      410.12

关于小数的链接到MSDN。 http://msdn.microsoft.com/en-us/library/ms187746.aspx

希望有帮助...

答案 1 :(得分:4)

数字不相等:

SELECT  CAST(convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)) AS BINARY(8))
UNION ALL
SELECT  CAST(convert(float, 410.115) AS BINARY(8)) as bin

----
0x4079A1D70A3D70A3
0x4079A1D70A3D70A4

答案 2 :(得分:2)

'float'是近似数字数据类型,因此并非数据类型范围内的所有值都可以准确表示。

这基于http://msdn.microsoft.com/en-us/library/ms173773.aspx

我相信这就是使用浮点值时出现舍入问题的原因。你永远不能百分百肯定!

实施例。 选择圆形(转换(浮点数,1.5555),2) - 给1.56

选择回合(转换(浮动,1.555),2) - 给1.55!

使用这样一个简单的数字,使用float时预期结果会有所不同。