当前位置:  开发笔记 > 编程语言 > 正文

为什么0.29999999999999998转换为0.3?

如何解决《为什么0.29999999999999998转换为0.3?》经验,为你挑选了1个好方法。

它在内部如何运作?

它是如何决定转换0.299999999999999980.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在范围内,因此无需更多数字即可正确识别双精度数.



1> Patricia Sha..:

涉及两次转换.

首先将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在范围内,因此无需更多数字即可正确识别双精度数.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有