ホームページ  >  記事  >  バックエンド開発  >  Goでfloat64をint64に変換する安全な方法はありますか?

Goでfloat64をint64に変換する安全な方法はありますか?

PHPz
PHPz転載
2024-02-08 21:50:34505ブラウズ

在 Go 中是否有安全的方法将 float64 转换为 int64?

php エディター Zimo から、Go で float64 を int64 に安全に変換することについて質問があります。精度の損失と範囲のオーバーフローを考慮する必要があります。 Go では、数学パッケージの Round 関数を使用して、浮動小数点数を丸め、整数に変換できます。ただし、浮動小数点数が int64 の範囲を超える場合、変換処理中にオーバーフローエラーが発生する可能性があるので注意してください。この状況を回避するには、数学パッケージの IsNaN 関数を使用して浮動小数点数が NaN であるかどうかを確認し、それを変換して変換の安全性を確保します。これにより、変換プロセス中の精度の損失や範囲のオーバーフローの問題が確実に回避されます。

質問内容

Go が提供する int() または int64() という型変換関数を知っています。 表現可能な最大の 64 ビット浮動小数点数 math.MaxFloat64math.MaxInt64 よりはるかに大きいことを考慮すると、int64 を # に変換する安全な方法はありますか? ##int64 (切り捨てあり,)?オーバーフローエラーを引き起こす方法はありますか?

回避策

float64 から int64 に (変換または型キャストではなく) 変換している場合は、Compares を使用して浮動小数点値を変換できます。 math.maxint64 から math.minint64 に最も近い倍精度整数値。これらの数値を float64 値に正確に格納することはできませんが、これらの数値の上または下の次の整数値として格納されます: リーリー

したがって、

float64 値がこれら 2 つの値の間にある限り、オーバーフローすることなく int64 に変換できることがわかります。

ただし、逆方向に変換した場合、

float64すべての int64# から int64## までを正確に表現できるという保証はないことに注意してください。 値。倍精度浮動小数点値には 52 ビットの精度しか含まれないためです。この場合、int64 値が -1<<531<<53 の間にあるかどうかを確認する必要があります。 どちらの場合でも、

math/big パッケージを使用して、より大きな値を処理できます。

以上がGoでfloat64をint64に変換する安全な方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。