啊哈!
您给出的文章中概述的问题是,对于某些数字,计算机显示的东西在理论上是正确的,但不是我们人类会使用的东西。
例如,如文章所说,1.2999999... = 1.3,因此如果您的结果是 1.3,那么计算机将其显示为 1.299999999...(非常)正确...但这不是您所看到的。 ..
现在的问题是计算机为什么要这样做?原因是计算机以 2 为底(二进制)计算,而我们通常以 10 为底(十进制)计算。结果是一样的(感谢上帝!),但内部存储和表示不一样。
有些数字在以 10 为底显示时看起来不错,例如 1.3,但其他数字则不然,例如 1/3 = 0.333333333....在以 2 为底时也是如此,有些数字在底数中“看起来”不错2(通常由 2 的分数组成)而其他不是。当计算机在内部存储数字时,它可能无法“准确地”存储它并存储最接近的可能表示形式,即使该数字在十进制中看起来“有限”。所以是的,在这种情况下,它有点“漂移”。如果你一次又一次地这样做,你可能会失去精确度。但是没有其他方法(除非使用能够存储分数的特殊数学库)
当计算机试图以 10 为基数将你给它的数字还给你时,问题就出现了。那么计算机可能会给你 1.299999 而不是你预期的 1.3。
这也是为什么您应该从不将浮点数与 ==、 进行比较,而是使用特殊函数 islessgreater(a, b) isgreater(a, b) 等等。
因此,您使用的实际函数 (sprintf) 很好,并且尽可能精确,它为您提供正确的值,您只需要知道在处理浮点数时,如果您期望 1.3
现在,如果您想“漂亮地打印”这些数字以获得最佳的“人类”表示(以 10 为基数),您可能需要使用一个特殊的库,例如您的 grisu3,它会尝试消除可能发生的漂移并将数字与最接近的以 10 为底的表示对齐。
现在库无法使用水晶球来查找是否漂移了哪些数字,因此您真的可能会以存储在计算机中的最大精度表示 1.2999999,并且库将“转换” " 到 1.3...但它并不比显示 1.29999 而不是 1.3 更差,也没有更精确。
如果您需要良好的可读性,这样的库会很有用。如果没有,那只是浪费时间。
希望有帮助!