我嘗試去轉到浮點數師
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.是浮點數的精度限制嗎?
我嘗試去轉到浮點數師
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.是浮點數的精度限制嗎?
程序輸出正確。以IEEE格式表示許多實數並不精確。第一個數字實際上(在它的有限64位版本中)小於3,所以floor會正確返回'2'。第二個是在編譯時使用更高的精度計算的。
Recomended reading。
是的,這是精度限制。 float64非常精確,但2.4不能準確存儲在二進制文件中。當兩個數字都是常數時,計算在編譯時以更高的精度完成,並且當結果四捨五入爲float64時,結果恰好爲3.但是當其中一個數字是變量時,必須完成計算它出現在2.9999999999999996,其中Floor被截斷爲2.
雖然這並不回答問題(爲什麼)我發現這個頁面尋找一個圓形函數,以防萬一有人發現它有幫助這是我自己的解決方案:
func Round(val float64) (float64) {
if float64(int(val)) < val {
return float64(int(val) + 1)
}
return val
}
好,我必須把搞它給我3,所以我做:'常量NUDGE = 1E-10'和'math.Floor(W/0.8 +微調)' – 2013-03-15 14:38:55