2013-03-11 33 views
5

我嘗試去轉到浮點數師

w:=float64(2.4) 
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8)) 

讓2.4/0.8 = = 3這給了我 「2 3」。

問題是爲什麼math.Floor(w/0.8)不會給我3.是浮點數的精度限制嗎?

+0

好,我必須把搞它給我3,所以我做:'常量NUDGE = 1E-10'和'math.Floor(W/0.8 +微調)' – 2013-03-15 14:38:55

回答

9

程序輸出正確。以IEEE格式表示許多實數並不精確。第一個數字實際上(在它的有限64位版本中)小於3,所以floor會正確返回'2'。第二個是在編譯時使用更高的精度計算的。

Recomended reading

7

是的,這是精度限制。 float64非常精確,但2.4不能準確存儲在二進制文件中。當兩個數字都是常數時,計算在編譯時以更高的精度完成,並且當結果四捨五入爲float64時,結果恰好爲3.但是當其中一個數字是變量時,必須完成計算它出現在2.9999999999999996,其中Floor被截斷爲2.

0

雖然這並不回答問題(爲什麼)我發現這個頁面尋找一個圓形函數,以防萬一有人發現它有幫助這是我自己的解決方案:

func Round(val float64) (float64) { 
     if float64(int(val)) < val { 
      return float64(int(val) + 1) 
     } 
     return val 
    } 
+1

這不是一個循環函數。這甚至不是一個正確的天花板功能。使用數學庫。 – JimB 2014-08-06 19:14:02

+0

對我來說這是一個正確的天花板功能。我需要將x.x四捨五入到x + 1,所以這裏是函數。數學庫沒有提供這樣的功能。我已經檢查過了。 – hey 2014-08-06 20:55:59

+0

然後,如果它是吊頂功能,則不要將其稱爲Round。這不處理負面,Inf或NaN。 [math.Ceil](http://golang.org/pkg/math/#Ceil)。 – JimB 2014-08-06 21:08:15