首頁 >後端開發 >Golang >為什麼 Go 中的無型別和型別浮點乘法會產生不同的結果?

為什麼 Go 中的無型別和型別浮點乘法會產生不同的結果?

Linda Hamilton
Linda Hamilton原創
2024-12-25 16:32:11416瀏覽

Why Do Untyped and Typed Floating-Point Multiplications in Go Produce Different Results?

為什麼這兩個 float64 有不同的值?

簡介

使用浮動時- 點數,了解精確度限制至關重要。考慮以下 Go 程式碼:

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)

(Go Playground 連結)

由於浮點精度,第二行產生預期結果“9.120000000000001”

問題

但是,第一行列印“9.12”,沒有任何尾隨精度。這就提出了一個問題:為什麼 Go 不對兩個無類型常數進行浮點乘法,然後將它們轉換為 9.12 文字?

答案

根據根據 Go 語言規範,常數表達式精確計算。因此,「912 * 0.01」被精確計算,與「9.12」相同。

當您將第一個運算元強制轉換為 float64 (float64(912)) 時,另一個運算元 (0.01) 也會轉換為 float64 (float64(912))。隱式型別轉換為 float64。 0.01 無法在 float64 中精確表示,因此與第一個範例不同的位置會失去精度。這解釋了將 fmt.Println() 與不同的輸入表達式一起使用時觀察到的不同結果。

以上是為什麼 Go 中的無型別和型別浮點乘法會產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn