javascript - 拆分数字字符串时的意外结果
问题描述
当下面的数字转换成字符串,然后在小数点处拆分时,表示小数部分的字符串是不正确的。预期值为 0123456789,但控制台中显示的值为 01234567。
const number = 123456789.0123456789;
console.log(number.toString().split("."));
如果小数点左边的位数发生了变化,那么控制台中显示的小数部分也会发生变化,但到目前为止我所做的测试不超过 8 个字符。为什么会这样?如何让它显示小数点后的真实数字字符串?
编辑 -
经过反复试验,这里有一些额外的发现 -
当number = 2097151.0123456789
小数部分正确时。
当number = 2097152.0123456789
小数部分不正确时。
解决方案
js 中浮点数的二进制表示由 64 位组成,遵循国际 IEEE 754 标准:
- 一个符号位,
- 11个指数位和
- 52 个有效位。
数字 f 存储为 f = s · m · 2^e,其中 s 为 1 或 -1。
由于二进制系统中的表示,如果浮点数在十进制系统中是有限的(例如 12,45)但在二进制系统中是周期性的(例如 1100,01110011001100110011001100...),则可能会出现问题。
由于空间有限,数字会四舍五入。有时在重新转换为十进制时可以恢复这种舍入;但是,在某些情况下,由于精度不足(即另一个数字具有相同的表示),这是不可能的。
推荐阅读
- node.js - 未经同意屏幕使用 Drive API 将文件上传到 Google Drive
- javascript - 如何改变满足一定条件的数组的两个连续值?
- python - LSTM 输入形状和输出
- python - 如何在pydruid中使用ThetaSketchOp函数
- ios - 关闭视频播放器后未删除设备方向
- mongodb - 查询以更新 mongodb 中的数组元素
- amazon-ec2 - 在 Pending:Wait 状态下终止 Autoscaling 实例(带 Terraform)
- angular - 如何从 Nativescript WebView 读取 URL?
- emscripten - 问题:使用 emscripten 从 jmodelica 编译 FMU c 代码
- c - 需要帮助了解 GCC 编译如何在 linux 和 macOS 上工作