嘗試在 Go 中將 float64 數字轉換為 uint64 時,可能會出現精確度問題。這通常會導致意外的行為,因為 float64 的小數部分在轉換過程中被丟棄。
說明問題:
package main import "fmt" func main() { var n float64 = 6161047830682206209 fmt.Println(uint64(n)) }
此代碼將打印以下不正確的值:
6161047830682206208
問題
問題的根源差異在於Go 中常數和浮點數的表示方式。常數以任意精確度表示,而浮點數遵循 IEEE 754 標準。這意味著雖然常數可以表示沒有精確度損失的值,但浮點數可用於儲存數字的位數有限(float64 為 53 位元)。
解
要正確地將 float64 轉換為 uint64,必須確保 float64 數字可以在可用的 52 位元內精確表示。否則,精度將會遺失。您可以透過驗證 float64 值是否在 uint64 的可表示範圍內來完成此操作。
以下是在轉換之前檢查可表示性的函數範例:
func Float64ToUint64(n float64) (uint64, error) { if (n < 0) || (n > math.MaxUint64) { return 0, errors.New("value out of range") } return uint64(n), nil }
以上是如何在 Go 中安全地將 float64 轉換為 uint64?的詳細內容。更多資訊請關注PHP中文網其他相關文章!