我试图找出SQL Server在从以下sql语句返回9.999999999999999e+004
时返回1.000000000000000e+005
的原因:
select Convert(
varchar(32),
round(cast('123456' as Float), -5),
2
)
更有趣的是以下语句正确返回:1.0000000e + 005
select Convert(varchar(32),
round(cast('123456' as Float), -5),
1
)
非常感谢任何帮助。
答案 0 :(得分:2)
我最好的猜测是round()
的内部计算是有效的:
(123456 / 100000.0) * 100000.0
除法产生的小数部分偏离最低位,因为浮点算术不会这样做。
(以上不会重现问题,因为计算在整数和小数之间。没有浮点值。)
请注意,'123456'
周围的引号不需要引发问题。但是,因为带小数点的数字被解释为小数而不是浮点数,所以convert(varchar(32), 123456.0, 2)
不会发生这种情况。
格式“1”和“2”之间的区别很有意思。我也会把它归结为浮点运算的变幻莫测。
我猜你可以找出非常简单的解决办法。
而且,正如我在评论中提到的那样,这有点奇怪。浮点表示可以精确地表示123,456以及100,000。问题必须是中间值。
答案 1 :(得分:-1)
关于浮点数如何不能代表每个有理数,因为你只限于使用位来表示整数。 9.999 .. ^ 4是最接近的64位或32位浮点数可以表示10 ^ 5。
这不是一个错误,更像是一个实施限制。