Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么是(327.59*100.0)<;32759.0对吗?_F#_Floating Point - Fatal编程技术网

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”隐藏了它