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

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

Linda Hamilton
發布: 2024-12-25 16:32:11
原創
470 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板