它在内部如何运作?
它是如何决定转换0.29999999999999998
为0.3
,即使0.3
不能用二进制表示?
这是一些更多的例子:
scala> 0.29999999999999998 res1: Double = 0.3 scala> 0.29999999999999997 res2: Double = 0.3 scala> 0.29999999999999996 res3: Double = 0.29999999999999993 scala> 0.29999999999999995 res4: Double = 0.29999999999999993
Patricia Sha.. 10
涉及两次转换.
首先将0.29999999999999998转换为0.299999999999999988897769753748434595763683319091796875,最近的可表示数字.
接下来,将0.299999999999999988897769753748434595763683319091796875转换为十进制进行打印.0.3也是转换为0.299999999999999988897769753748434595763683319091796875的号码中的一个,并且其是被印刷的,因为它是如此之短的一个.
每个有限双数都可以精确表示为小数.通常,默认输出不会尝试打印确切的值,因为它可能非常长 - 远远超过上面的示例.一个常见的选择是打印最短的小数部分,它将转换为输入的双倍.两次转换都是使用非平凡算法完成的.请参阅算法将IEEE 754双精度转换为字符串?对于一些讨论和输出算法的参考.
================================================== ============
关于价值0.30000000000000004的评论已有一些讨论.我同意Rick Regan和Jesper的评论,但认为增加这个答案可能会有用.
最接近的两倍到0.30000000000000004的确切值是0.3000000000000000444089209850062616169452667236328125.在范围内的所有十进制数[0.3000000000000000166533453693773481063544750213623046875,0.3000000000000000721644966006351751275360584259033203125]转换为价值,并没有数字甚至略有超出这个范围这么做.0.3000000000000000超出范围,因此没有足够的数字.0.30000000000000004在范围内,因此无需更多数字即可正确识别双精度数.
涉及两次转换.
首先将0.29999999999999998转换为0.299999999999999988897769753748434595763683319091796875,最近的可表示数字.
接下来,将0.299999999999999988897769753748434595763683319091796875转换为十进制进行打印.0.3也是转换为0.299999999999999988897769753748434595763683319091796875的号码中的一个,并且其是被印刷的,因为它是如此之短的一个.
每个有限双数都可以精确表示为小数.通常,默认输出不会尝试打印确切的值,因为它可能非常长 - 远远超过上面的示例.一个常见的选择是打印最短的小数部分,它将转换为输入的双倍.两次转换都是使用非平凡算法完成的.请参阅算法将IEEE 754双精度转换为字符串?对于一些讨论和输出算法的参考.
================================================== ============
关于价值0.30000000000000004的评论已有一些讨论.我同意Rick Regan和Jesper的评论,但认为增加这个答案可能会有用.
最接近的两倍到0.30000000000000004的确切值是0.3000000000000000444089209850062616169452667236328125.在范围内的所有十进制数[0.3000000000000000166533453693773481063544750213623046875,0.3000000000000000721644966006351751275360584259033203125]转换为价值,并没有数字甚至略有超出这个范围这么做.0.3000000000000000超出范围,因此没有足够的数字.0.30000000000000004在范围内,因此无需更多数字即可正确识别双精度数.