為什麼這兩個 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中文網其他相關文章!