首页 > 解决方案 > 为什么 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

标签: javascriptfloating-pointieee-754

解决方案


将值转换为十进制数字时,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).


推荐阅读