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 中国語 Web サイトの他の関連記事を参照してください。