Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Math.powを利用した計算

int count;
double num;

count = 1;

1.
num = num + Math.pow(0.1, count); count++;
System.out.println(num);

実行結果
1回目 0.1
2回目 0.11000000000000001
3回目 0.11100000000000002

2.
for(i=1;i<=Math.pow(10, count);i=i*10){}
num = num + 10.0/i; count++;
System.out.println(num);

実行結果
1回目 0.1
2回目 0.11
3回目 0.111
4回目 0.1111
5回目 0.11111
6回目 0.111111
7回目 0.1111111
8回目 0.11111111
9回目 0.111111111
10回目 0.11111111109999999

予定では、0.11111111111…となるつもりですが…
途中から、実行結果が上手くいかなくなります。
1.の場合は、理由が分かったので、2.の方法を
考えたのですが、やはり上手くいきませんでした。
2.の場合の、理由が分からないので、どなたか
教えて頂けませんでしょうか?

4

回答

5174

閲覧

4件の回答

評価

0

丸めって知ってる?

評価

0

データの世界では
小数は有限なのよ。

評価

0

もうちょっと細かいことを言うと、
2進数表記と10進数表記の違いによる誤差が原因だね。

評価

0

$殿
丸めは知りませんでした。
調べてみたところ、このような方法もあるのですね。
新しい知識が1つ増えました。ありがとうございます。


てんこ殿
なるほど、無限ではないので、想像通りにいかない事が
起きてしまったのですね。ありがとうございます。


不良社員殿
その結論に至ったのですが、確信が持てないでいました。
どうもありがとうございます。

結局、stringを利用して、0.1111111…を実現することに
しました。みなさんありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。