为什么5726718050568503296在JS中被截断了

Why is 5726718050568503296 truncated in JS

As per the standard ES 将数字实现为 IEEE754 双倍数。

根据 https://www.binaryconvert.com/result_double.html?decimal=053055050054055049056048053048053054056053048051050057054 and other programming languages https://play.golang.org/p/5QyT7iPHNim 看来 5726718050568503296 值可以准确表示而不会丢失精度。

为什么它在 JS 中丢失 3 位有效数字(在最新的稳定 google chrome 和 firefox 中重现)

这个问题最初是由

触发的

该值在 double IEEE754 中绝对是可表示的,看看如何在 Go 中将裸位转换为 float64:https://play.golang.org/p/zMspidoIh2w

default rule for JavaScript when converting a Number value to a decimal numeral就是用足够的数字来区分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.=4,168,5 区分开来

您可以使用 .toPrecision 请求更精确的字符串转换,如 x.toPrecision(21).