Go 中的浮點精確度差異:文字與變數
在Go 中,浮點運算的行為在比較時可能看起來是矛盾的涉及文字和變數的操作。讓我們檢查以下程式碼:
package main import ( "fmt" ) func main() { x := 10.1 fmt.Println("x == 10.1: ", x == 10.1) fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0) fmt.Println("x*3.0: ", x*3.0) fmt.Println("10.1*3.0: ", 10.1*3.0) }
執行時,此程式碼顯示以下輸出:
x == 10.1: true x*3.0 == 10.1*3.0: false x*3.0: 30.299999999999997 10.1*3.0: 30.3
如輸出所示,x*3.0 和10.1*3.0 的比較意外地評估為false。這就提出了為什麼會出現這種差異以及它是故意的還是錯誤的問題。
理解設計
在 Go 中,浮點文字和常數具有無限的精確度。然而,當它們被分配給類型化變數時,它們的精確度受到目標類型的限制。在上面的範例中,x := 10.1 將文字 10.1 儲存在 float64 變數中。由於 float64 類型的限制,此轉換會導致一些精度損失。
相反,表達式 10.1*3.0 直接對文字執行浮點乘法,保留其完整精確度。與 x*3.0 相比,這會導致值略有不同,其中 x 的精度降低會影響計算。
文件和資源
Go 官方文件承認了這一點常量文章的「浮動」部分下的行為。它解釋了雖然數字常數具有任意精度,但它們在分配時必須適合目標類型。像 1e1000 這樣的大值可以在具有其他常數的表達式中使用,但是當結果儲存在較窄的類型中時,它們的精確度可能會受到影響。
儘管文章沒有明確提到我們範例中觀察到的具體行為(x*3.0 與 10.1*3.0),它提供了對精確度限制如何應用於常數和類型變數的一般理解。
以上是為什麼 Go 中的浮點比較對於文字和變數會產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!