有人能解釋爲什麼int (0.4 * 10.0)
是4
但int ((2.4 - 2.0) * 10.0)
是3
?在F#中將float轉換爲int#
然後請解釋如何獲得4
。即我真的必須做int (System.Math.Round((2.4 - 2.0) * 10.0))
?
對於那些應該如此簡單的事情來說,這太醜陋了。
有人能解釋爲什麼int (0.4 * 10.0)
是4
但int ((2.4 - 2.0) * 10.0)
是3
?在F#中將float轉換爲int#
然後請解釋如何獲得4
。即我真的必須做int (System.Math.Round((2.4 - 2.0) * 10.0))
?
對於那些應該如此簡單的事情來說,這太醜陋了。
2.4 - 2.0的雙重表示是0.399999999999。當您將數字轉換爲int時,小數部分被截斷,因此3.999999999被截斷爲3.
這是正確的,如果你想得到4.0,那麼你可以使用Math.Round: Math.Round((2.4 - 2.0)* 10.0) – Robert 2009-01-04 16:47:53
浮點數不是無限精度。一些數字可以完美地表示(任何涉及兩個冪的事物,例如1,1/2 = 0.5,1/4 = 0.25等),而其他數字不能(例如1/3不能精確地分解爲有限序列兩個權力)。通常情況下,斬斷無限序列的末尾會導致數字的編碼版本稍微小於其真實值。
與事實結合這使(INT)運算符截斷,而不是發了,你可以運行到其中一個操作,即應該產生4.0結果3.999999999991代替,成爲3
任何時間的情況下你正在嘗試將浮動/雙精度轉換爲整數,你要仔細考慮要使用哪個運算符 - 截斷(舍入),舍入或舍入到最近。
由於這是浮點表示法的問題,不僅在F#中,而且在C#和(IIRC)Java和其他語言中都是如此。
然後還請解釋如何得到4.即我真的要做
INT(System.Math.Round((2.4 - 2.0)* 10.0))
它只是如此醜陋的東西應該如此簡單。
當然不是,只是定義
let round x = int System.Math.Round(x)
其實,在.net中有一個decimal
數據類型,這將有助於你解決這個問題,如果你的號碼,可以完全按照小數表示。
2.4m - 2.0m == 0.4m
2.4 - 2.0 != 0.4
隱蔽一個float
數量的int
使用:
let i = Convert.ToInt32(f)
只需要注意新用戶(如我):需要先打開System – sebhofer 2018-02-06 14:06:37
應當指出的是,這不是F#具體的「問題」,而是在大多數語言的性質,在至少所有的.NET。 – 2013-02-07 08:50:22