我们遇到的问题减少为以下两个陈述:
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没有在这台机器上显示任何格式(非常奇怪)。
答案 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时预期结果会有所不同。