首頁 > 後端開發 > Golang > 為什麼 Go 中的浮點比較對於文字和變數會產生不同的結果?

為什麼 Go 中的浮點比較對於文字和變數會產生不同的結果?

Mary-Kate Olsen
發布: 2024-12-09 15:04:16
原創
750 人瀏覽過

Why do floating-point comparisons in Go yield different results for literals and variables?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板