gpt4 book ai didi

scala - 为什么 0.29999999999999998 转换为 0.3?

转载 作者:行者123 更新时间:2023-12-01 07:04:07 26 4
gpt4 key购买 nike

它在内部如何运作?

怎么决定转换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

最佳答案

涉及两个转换。

首先将 0.29999999999999998 转换为 0.299999999999999988897769753748434595763683319091796875,这是最接近的可表示数。

接下来将0.29999999999999988897769753748434595763683319091796875转换为十进制进行打印。 0.3 也是转换为 0.29999999999999988897769753748434595763683319091796875 的数字之一,因为它太短而被打印出来。

每个有限双数都可以精确地表示为小数。通常,默认输出不会尝试打印确切的值,因为它可能很长 - 比上面的示例长得多。一个常见的选择是打印最短的小数部分,以便在输入时转换为 double 数。两种转换都是使用非平​​凡算法完成的。见 Algorithm to convert an IEEE 754 double to a string?有关输出算法的一些讨论和引用。

================================================== ============

在评论中对值 0.30000000000000004 进行了一些讨论。我同意 Rick Regan 和 Jesper 的评论,但认为添加到这个答案可能有用。

最接近 0.30000000000000004 的精确值是 0.3000000000000000444089209850062616169452667236328125。范围内的所有十进制数 [0.3000000000000000166533453693773481063544750213623046875, 0.30000000000000000721644966056230353523523523535235235353523535353535353535之外0.3000000000000000 超出范围,因此没有足够的位数。 0.30000000000000004 在范围内,因此不需要更多数字来正确识别 double 数。

关于scala - 为什么 0.29999999999999998 转换为 0.3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34081470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com