我已阅读 this Stack Overflow thread ,和 this blog post ,但我仍然无法理解为什么有些 float 可以用二进制精确表示,而有些则不能。
据我了解0.1
, 0.2
, 0.3
, 0.4
, 0.6
, 0.7
, 0.8
, 0.9
将给出二进制系统中的无限分数作为其分母,因为 10 和 5 都不能用 2 的幂表示。 0.5
然而分母为2^1
.
当我添加0.2 + 0.4
时,我得到0.6000000000000001
,当我添加0.1 + 0.5
时,我得到0.6
。我认为这是因为,在第一个和中,我添加了两个无限分数,而在第二个和中,我添加了 0.5
,其具有有限表示,其中 0.1
,但事实并非如此。但是,当我添加0.3 + 0.4
时,我得到0.7
,这是我没想到的,考虑到 0.3
和0.4
没有精确的表示,0.7
也没有。
我本以为从0.5
开始是 0.1
中唯一的小数至0.9
(仅一位小数)使用有限表示,使用任何其他小数都会给出不精确的表示,但事实并非如此。
为什么在二进制中添加一些没有有限表示的一位小数会产生精确的表示,而另一些则不会?
最佳答案
在 JavaScript 中将数字值转换为字符串时,默认值为 to use just enough digits to uniquely distinguish the Number
value 。这意味着当一个数字显示为“0.6”时,并不意味着它恰好是 0.6,只是它比任何其他数字值更接近 0.6,因此仅显示“0.6”告诉您这是这个唯一的数字值,即 0.59999999999999997779553950749686919152736663818359375。
当您将 Number 对象设置为 0.2
和 0.4
时,结果实际上是 0.200000000000000011102230246251565404236316680908203125 和 0.4000000000000000222044604925 0313080847263336181640625。添加这些后,结果为 0.600000000000000088817841970012523233890533447265625。这与 0.59999999999999997779553950749686919152736663818359375 不同,而且距离 0.6 更远,因此 JavaScript 将其显示为“0.6000000000000001”,以表明它与显示为“0.6”的数字不同。
当您将 Number 对象设置为 0.1
和 0.5
时,结果为 0.1000000000000000055511151231257827021181583404541015625 和 0.5。当你添加这些时,结果是 0.59999999999999997779553950749686919152736663818359375,这是 JavaScript 显示为“0.6”的数字。
关于javascript - JavaScript 中 float 的加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50745411/