2009-01-04 236 views
7

有人能解釋爲什麼int (0.4 * 10.0)4int ((2.4 - 2.0) * 10.0)3在F#中將float轉換爲int#

然後請解釋如何獲得4。即我真的必須做int (System.Math.Round((2.4 - 2.0) * 10.0))

對於那些應該如此簡單的事情來說,這太醜陋了。

+2

應當指出的是,這不是F#具體的「問題」,而是在大多數語言的性質,在至少所有的.NET。 – 2013-02-07 08:50:22

回答

11

2.4 - 2.0的雙重表示是0.399999999999。當您將數字轉換爲int時,小數部分被截斷,因此3.999999999被截斷爲3.

+1

這是正確的,如果你想得到4.0,那麼你可以使用Math.Round: Math.Round((2.4 - 2.0)* 10.0) – Robert 2009-01-04 16:47:53

1

浮點數不是無限精度。一些數字可以完美地表示(任何涉及兩個冪的事物,例如1,1/2 = 0.5,1/4 = 0.25等),而其他數字不能(例如1/3不能精確地分解爲有限序列兩個權力)。通常情況下,斬斷無限序列的末尾會導致數字的編碼版本稍微小於其真實值。

與事實結合這使(INT)運算符截斷,而不是發了,你可以運行到其中一個操作,即應該產生4.0結果3.999999999991代替,成爲3

任何時間的情況下你正在嘗試將浮動/雙精度轉換爲整數,你要仔細考慮要使用哪個運算符 - 截斷(舍入),舍入或舍入到最近。

由於這是浮點表示法的問題,不僅在F#中,而且在C#和(IIRC)Java和其他語言中都是如此。

5

然後還請解釋如何得到4.即我真的要做

INT(System.Math.Round((2.4 - 2.0)* 10.0))

它只是如此醜陋的東西應該如此簡單。

當然不是,只是定義

let round x = int System.Math.Round(x) 
4

其實,在.net中有一個decimal數據類型,這將有助於你解決這個問題,如果你的號碼,可以完全按照小數表示。

2.4m - 2.0m == 0.4m 
2.4 - 2.0 != 0.4 
2

隱蔽一個float數量的int使用:

let i = Convert.ToInt32(f)

+0

只需要注意新用戶(如我):需要先打開System – sebhofer 2018-02-06 14:06:37