参考链接:https://www.exploringbinary.com/the-shortest-decimal-string-that-round-trips-examples/。它说,计算机科学中一个众所周知的结果是,您需要17位有效的十进制数字来识别任意双精度浮点数。此外,它还使用了下面的示例
The floating point number 50388143.0682372152805328369140625 cannot be rounded to anything less than 17 digits and still round-trip. Rounded to 17 digits it’s 50388143.068237215, which converts back to our floating-point number. Rounded to 16 digits it’s 50388143.06823722, which is closer to the next floating-point number
这个链接让我越来越困惑。假设我的号码是50388143.0682372156805328369140625如果四舍五入到17位,就得到50388143.068237216。怎么和原来的数字一样?我不认为它是来回的。实际上它和原来的数不同。我错过了什么?
这个链接让我越来越困惑。假设我的数字是50388143.0682372156805328369140625,如果我四舍五入到17位,那么它就是50388143.068237216。怎么和原来的数字一样?
我的号码(作为我错过了什么?
double
)是50388143.068237215_6805328369140625;从一个错误的前提开始
double
可以编码多个值,但不能编码50388143.068237215_6805328369140625。相反,代码将使用附近的值:50388143.068237215_2805328369140625。
将其舍入为17显著将替换为文本变成"50388143.068237215"。
将该文本转换回double
再次生成double
,其值为50388143.068237215_2805328369140625。
一般来说,如果double
—>text(使用少于17位有效十进制数字)——>
double
,可能会导致相同的double
失败。17有效的十进制数字足以满足所有double
。
为什么17与典型的双编码53位有效二进制数字(~9*1015组合)有关,并且与二进制double
相比,十进制文本值的精度不稳定。