ホームページ > バックエンド開発 > Golang > Go で float64 を uint64 に安全に変換するにはどうすればよいですか?

Go で float64 を uint64 に安全に変換するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-15 02:44:10
オリジナル
205 人が閲覧しました

How to Safely Convert float64 to uint64 in Go?

float64 を uint64 に正しく変換する

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート