https://draveness.me/whys-the-design-floating-point-arithmetic/
为什么0.1+0.2不等于0.3?
如果你尝试在javascript中使用console.log(.1 + .2); 计算0.1+0.2的结果,那么你得到的答案会是0.30000000000000004。
我们常常会以为编程语言中的浮点数概念,就是对应数学中的小数,其实并不尽然。这是因为:
1. 编程中的浮点数的精度往往都是有限的,单精度的浮点数使用 32 位表示,而双精度的浮点数使用 64 位表示;
2. 数学中的小数系统可以通过引入无限序列 ... 可以任意的实数;
无论是 0.1 还是 0.2,这两个数字都不是二进制中的『整数』,而当我们试图用二级制来表示它们的时候,就只能通过无限循环小数尝试接近它们的真实值。此外,由于浮点数精度的局限,我们也无法用有限的位数精确地表示0.1和0.2。
这就是为什么0.1+0.2!=0.3的原因。更多其他编程语言在这道题上的表现,可以参考 https://0.30000000000000004.com
为什么0.1+0.2不等于0.3?
如果你尝试在javascript中使用console.log(.1 + .2); 计算0.1+0.2的结果,那么你得到的答案会是0.30000000000000004。
我们常常会以为编程语言中的浮点数概念,就是对应数学中的小数,其实并不尽然。这是因为:
1. 编程中的浮点数的精度往往都是有限的,单精度的浮点数使用 32 位表示,而双精度的浮点数使用 64 位表示;
2. 数学中的小数系统可以通过引入无限序列 ... 可以任意的实数;
无论是 0.1 还是 0.2,这两个数字都不是二进制中的『整数』,而当我们试图用二级制来表示它们的时候,就只能通过无限循环小数尝试接近它们的真实值。此外,由于浮点数精度的局限,我们也无法用有限的位数精确地表示0.1和0.2。
这就是为什么0.1+0.2!=0.3的原因。更多其他编程语言在这道题上的表现,可以参考 https://0.30000000000000004.com