- ベストアンサー
doubleからfloatへの変換でのトラブル
double test = 0.01; float test2 = (float)test; このプログラムを実行すると、test2には何故か「0.00999999998」という数字が入ってしまい、「0.01」にはなりません。正確にdoubleからfloatへキャストする方法はあるのでしょうか。 環境はWindows XP、Visual C++です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
我々が普段使っている数は、0, 1, 2, 3, 4, 5, 6, 7, 8, 9の十個の記号を組み合わせて表現します。 これは十進数と呼ばれています。 対してコンピューターは0, 1の二個の記号を組み合わせて数を表現します。 これは二進数と呼ばれています。 double型もfloat型も、二進数の形式で数を記録しています。 十進数だと、1/100(= 0.01)を小数で表現できますが、 1/3を小数で完璧に表現できません(0.333…と、終わりのない循環小数になる)。 十進数では分母が3の分数とは相性が悪いんです。 それと同じで、二進数は1/100(= 0.01)を小数で完璧に表現できません。 二進数では分母が100の分数とは相性が悪いからです。 十進数1/3が0.333…となったように、 二進数1/100も0.000000101000111…と終わりのない小数になります。 無限に続く数を保存することはできません。 そのため、double型やfloat型の変数に1/100を格納しようとすると、 変数には0.000000101000111…を途中で打ち切った数が格納されます。 『0.00000010100011』のような感じにです。 この打ち切り作業が誤差の原因です。 結局float、double型の変数を使っている以上、この手の誤差はどうしようもありません。
お礼
理解できました。分かりやすい解説ありがとうございました。