ホームページ > バックエンド開発 > Golang > Go で float64 を int に変換すると予期しない結果が生じるのはなぜですか?

Go で float64 を int に変換すると予期しない結果が生じるのはなぜですか?

Patricia Arquette
リリース: 2024-12-14 22:11:12
オリジナル
747 人が閲覧しました

Why Does Converting float64 to int in Go Produce Unexpected Results?

Go で float64 を int に変換する際のエラー

はじめに

Go で浮動小数点数 (float64) を整数 (int) に変換すると、次のような問題が発生する可能性があります。浮動小数点表現の制限により、予期しない結果が生じる可能性があります。

問題

100.55 のような 10 進数は、コンピューターで使用される内部表現である 2 進数の有限ビットを使用して正確に表現できません。 Go の Float64 値は、小数部に 53 ビットを使用する IEEE-754 標準に準拠しています。これは、100.55 が最も近い表現可能な 2 進数に近似されることを意味し、わずかな差異が生じます。

次のコードを考えてみましょう:

package main

import "fmt"

func main() {
    x := 100.55
    fmt.Println(x - float64(int(x)))
}
ログイン後にコピー

このコードを実行すると、出力されます。 :

0.5499999999999972
ログイン後にコピー

の代わりに0.55.

解決策

文字列フォーマッタ (fmt.Printf)

この不一致を処理する 1 つの方法は、印刷前に浮動小数点数を必要な精度に丸めることです。

package main

import "fmt"

func main() {
    x := 100.55
    fmt.Printf("%.2f\n", x)
}
ログイン後にコピー

このコードprints:

0.55
ログイン後にコピー

非浮動小数点表現

もう 1 つのアプローチは、浮動小数点数の使用を完全に避けることです。たとえば、ドル金額を表すには、セントを整数として使用し、表示時に 100 単位でスケールすることができます。

cents := 10055
fmt.Printf("%d.%d $\n", cents/100, cents%100)
ログイン後にコピー

このコードは次のように出力します。

100.55 $
ログイン後にコピー

以上がGo で float64 を int に変換すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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