首页 > 解决方案 > 拆分数字字符串时的意外结果

问题描述

当下面的数字转换成字符串,然后在小数点处拆分时,表示小数部分的字符串是不正确的。预期值为 0123456789,但控制台中显示的值为 01234567。

const number = 123456789.0123456789;
console.log(number.toString().split("."));

如果小数点左边的位数发生了变化,那么控制台中显示的小数部分也会发生变化,但到目前为止我所做的测试不超过 8 个字符。为什么会这样?如何让它显示小数点后的真实数字字符串?

编辑 -
经过反复试验,这里有一些额外的发现 -
number = 2097151.0123456789小数部分正确时。
number = 2097152.0123456789小数部分不正确时。

标签: javascript

解决方案


js 中浮点数的二进制表示由 64 位组成,遵循国际 IEEE 754 标准:

  • 一个符号位,
  • 11个指数位和
  • 52 个有效位。

数字 f 存储为 f = s · m · 2^e,其中 s 为 1 或 -1。

由于二进制系统中的表示,如果浮点数在十进制系统中是有限的(例如 12,45)但在二进制系统中是周期性的(例如 1100,01110011001100110011001100...),则可能会出现问题。
由于空间有限,数字会四舍五入。有时在重新转换为十进制时可以恢复这种舍入;但是,在某些情况下,由于精度不足(即另一个数字具有相同的表示),这是不可能的。


推荐阅读