F# 为什么是(327.59*100.0)<;32759.0对吗?
倍增F# 为什么是(327.59*100.0)<;32759.0对吗?,f#,floating-point,F#,Floating Point,倍增 (327.59 * 100.0) 产生一个小于32759的数字,为什么?如何避免这种情况呢?在F#Interactive的改进型漂亮打印机上,数字精度得到了充分展示 fsi.AddPrinter( fun (x:float) -> sprintf "%26.16e" x) (327.59 * 100.0) // val it : float = 3.2758999999999996e+004 32759.0 // val it : float = 3.275900
(327.59 * 100.0)
产生一个小于32759的数字,为什么?如何避免这种情况呢?在F#Interactive的改进型漂亮打印机上,数字精度得到了充分展示
fsi.AddPrinter( fun (x:float) -> sprintf "%26.16e" x)
(327.59 * 100.0)
// val it : float = 3.2758999999999996e+004
32759.0
// val it : float = 3.2759000000000000e+004
这就是为什么
(327.59 * 100.0) < 32759.0 = true
(327.59*100.0)<32759.0=true
这是浮点值的工作原理。为了避免这种情况,十进制双精度
基本上是一个二进制数。正因为如此,它不能准确地表示327.59
,相反,你会得到一些接近它的东西。正如@Petr所说,使用decimal
来避免这种情况decimal
使用基数10,因此327.59
可以精确表示。供参考;Kahan建议英特尔在70年代对浮点使用十进制。改变已经太晚了,40年后,我们一次又一次地付出代价。谢谢,printf“%f”隐藏了它