Javascript 拆分数字字符串时出现意外结果
如果将以下数字转换为字符串,然后在小数点处拆分,则表示小数部分的字符串不正确。预期值为0123456789,但控制台中显示的值为01234567Javascript 拆分数字字符串时出现意外结果,javascript,Javascript,如果将以下数字转换为字符串,然后在小数点处拆分,则表示小数部分的字符串不正确。预期值为0123456789,但控制台中显示的值为01234567 const number = 123456789.0123456789; console.log(number.toString().split(".")); 如果小数点左边的位数发生了变化,那么控制台中显示的小数部分也会发生变化,但对于我到目前为止所做的测试,显示的小数部分不超过8个字符。为什么会这样?如何让它显示小数点后的真正数字字符串 编辑-
const number = 123456789.0123456789;
console.log(number.toString().split("."));
如果小数点左边的位数发生了变化,那么控制台中显示的小数部分也会发生变化,但对于我到目前为止所做的测试,显示的小数部分不超过8个字符。为什么会这样?如何让它显示小数点后的真正数字字符串
编辑-经过一些尝试和错误测试后,以下是一些额外的发现-
当
number=2097151.0123456789时,小数部分是正确的。
当number=2097152.0123456789时,小数部分不正确。
按照国际IEEE 754标准,js中浮点的二进制表示由64位组成:
- 一个符号位
- 11指数位和
- 52个有效位
数字f存储为f=s·m·2^e,其中s为1或2−一,
由于二进制中的表示形式,如果浮点数在十进制中是有限的(例如12,45),但在二进制中是周期性的(例如110001111001100…),则可能会出现问题。
由于空间有限,该数字将四舍五入。有时,这种舍入可以在重新转换为十进制时恢复;但是,在某些情况下,由于精度不够(即另一个数字具有相同的表示形式),这是不可能的。Dot(。
是一个regex元字符,表示任意一个字符。如果要在文字点上拆分,请使用反斜杠对其进行转义:number.toString().split(/\./)
如果在它转换为字符串之前仅对number
进行控制台操作,您将看到它作为编号123456789.01234567
记录。我认为你遇到了JS浮动的某种分辨率限制…这是否澄清了你的问题?