• ベストアンサー

doubleからfloatへの変換でのトラブル

double test = 0.01; float test2 = (float)test; このプログラムを実行すると、test2には何故か「0.00999999998」という数字が入ってしまい、「0.01」にはなりません。正確にdoubleからfloatへキャストする方法はあるのでしょうか。 環境はWindows XP、Visual C++です。

質問者が選んだベストアンサー

  • ベストアンサー
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.2

我々が普段使っている数は、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型の変数を使っている以上、この手の誤差はどうしようもありません。

BearCave
質問者

お礼

理解できました。分かりやすい解説ありがとうございました。

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

floatの有効桁は7桁程度なので、9桁も表示してはいけません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

ないのではないでしょうか。 そもそも、double型の変数testの値が 「厳密に」0.01であるかどうかも怪しいと思います。 浮動小数点数を扱う際、その程度の誤差はありえますので、 トラブルとはいえないと思います。

BearCave
質問者

お礼

ありがとうございました。

関連するQ&A