为什么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)
.
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)
.