javascript - 为什么 5726718050568503296 在 JS 中被截断
问题描述
根据标准, ES 将数字实现为 IEEE754 双倍。
根据https://www.binaryconvert.com/result_double.html?decimal=053055050054055049056048053048053054056053048051050057054和其他编程语言https://play.golang.org/p/5QyT7iPHNim看起来5726718050568503296
可以准确地表示该值而不会丢失精度。
为什么它在 JS 中丢失 3 位有效数字(在最新稳定的谷歌浏览器和火狐中转载)
这个问题最初是从golang 中的复制 javascript 不安全数字触发的
该值绝对可以在双 IEEE754 中表示,请参阅 Go 中如何将裸比特转换为 float64:https: //play.golang.org/p/zMspidoIh2w
解决方案
将值转换为十进制数字时,JavaScript的默认规则Number
是使用足够的数字来区分该Number
值。具体来说,这源于 ECMAScript 2017 语言规范第 7.1.12.1 条中的第 5 步,根据链接的答案。(2020版本是6.1.6.1.20。)
因此,虽然 5,726,718,050,568,503,296 是可表示的,但打印它会产生“5726718050568503000”,因为这足以将其与相邻的可表示值 5,726,718,050,568,502,272 和 5,726,718,050,568,504,320 区分开来。
您可以使用 请求更精确的字符串转换.toPrecision
,如x.toPrecision(21)
.
推荐阅读
- javascript - 使用javascript向元素的空白innerHTML添加样式
- gridview - Change number of items in RallyGrid
- android - 按下主页按钮时,重新启动应用程序,然后从开始打开
- scala - Apache flink:使用 keyBy/connect 维护流中的消息输入顺序
- sql - Keep only most recent rows by date
- jenkins - 在 Jenkins 文件中尝试 Catch
- ios - 如何从 Xcode 中的 iOS 照片库中获取图像的路径?
- r - R中介包:逗号后面的数字
- xamarin.forms - 在 Dryioc 中注册和注销服务
- python - Anaconda 根前缀不正确