为什么当C ++没有时,JavaScript会搞砸0.1 + 0.2?

时间:2014-07-27 07:20:08

标签: javascript c++ floating-point floating-accuracy

我理解,对于double的IEEE表示(或任何二进制表示),我不能用有限的位表示0.1

我有两个问题:

  1. 当C ++也为double使用相同的标准时,为什么它不会像JavaScript一样陷入0.1 + 0.2
  2. 为什么JavaScript无法在内存中准确保存时正确打印console.log(0.1)

2 个答案:

答案 0 :(得分:3)

将浮点数转换为字符串至少有三个合理的选择:

  1. 打印确切的值。这似乎是一个明显的选择,但有缺点。有限浮点数的精确十进制值始终存在,但可能有数百个有效数字,其中大多数没有实际用途。 java.util.BigDecimal' sString执行此操作。
  2. 打印足够的数字以唯一标识浮点数。例如,这是在Java中进行的选择,用于默认转换double或float。
  3. 打印足够的数字以确保大多数输出​​数字不受大多数​​简单计算的舍入误差的影响。这是用C做出的选择。
  4. 这些都有优点和缺点。选择3转换将得到" 0.3","对"回答,加0.1和0.2的结果。另一方面,读取以这种方式打印的值不能依赖于恢复原始浮点数,因为多个浮点值映射到同一个字符串。

    我认为这些选项中的任何一个都不是"对"或"错误"。语言通常具有强制其中一个非默认选项的方法,如果默认值不是特定输出的最佳选择,则应该这样做。

答案 1 :(得分:0)

因为它会将x打印到n个小数位。这恰好是正确的