为什么SQL Server会轮到9.999999999999999e + 004?

时间:2015-07-09 01:22:01

标签: sql sql-server casting rounding

我试图找出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
              )

非常感谢任何帮助。

2 个答案:

答案 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。

这不是一个错误,更像是一个实施限制。

了解更多信息:Wikipedia: Floating Point > Representable Numbers