我们如何需要 17 位有效的十进制数字来标识任意双精度浮点数?

How do we need 17 significant decimal digits to identify an arbitrary double-precision floating-point number?

参考link: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

这个link让我越来越困惑。假设我的号码是 50388143.0682372156805328369140625 如果我四舍五入到 17 个位置,则它变为 50388143.068237216。怎么和原来的号码一样?我没有看到它往返。事实上,它与原始号码不同。我错过了什么?

This link is confusing me more and more. Lets say my number is 50388143.0682372156805328369140625 and if i round to 17 places then it becomes 50388143.068237216. How is it same as original number?

What am i missing?

“我的号码(作为 double)是 50388143。068237215_6805328369140625”以错误的前提开始。

double 可以对许多值进行编码,但不能对一个值进行编码:50388143.068237215_6805328369140625。相反,代码将使用附近的值:50388143.068237215_2805328369140625.

四舍五入到 17 重要 个地方 as text 变成“50388143.068237215”。

将该文本转换回 double 再次生成值为 50388143.068237215_2805328369140625.

double

一般来说,if double --> text(使用少于17位significant的小数位)--> double, 被尝试,它可能不会导致相同的 double.

17 重要的 十进制数字足以满足所有 double.

为什么 17 与典型的双重编码 53 个重要 二进制 数字(~9*1015 组合)相关联,并且十进制文本值 摆动 与二进制 double 相比。