dポイントプレゼントキャンペーン実施中!

実数 2.0 に対して int(2.0) ==2 だが、
int(1.9), int (1.99), int(1.999), int(1.9999) , ・・・・
は 何ケタまで続けば 整数 2 になるか?
というプログラミングの問題なのですが、答えは16桁であってますか?
また、やり方が違っていればご指摘願います。



double d = 1.9999999999999999;

String s = "";
if(2==d){
s = ": if(2==d)";
}else{
s = ": if(2!=d)";
}
System.out.println(d+s);

A 回答 (1件)

INT変換は基本的に切り捨てです。


基本ルールとしては何桁続いても1.9999...は1です。

ただ、a=1/3;b=a*3;とした時にbを扱わなければならない為、有効桁の最後まで9が続く様な数字の場合切り上げるという処理が働きます。
この仮数部の有効桁数は52bitで10進数では15桁~17桁です。ですから指数部が指し示す少数域を9で埋めてあげれば切り上げ処理が働くことになります。
仮数部の有効桁数が15~17桁ですので数百万と言った大きな数字を入れると小数点以下の桁数は減ってゆきます。一方0.000009999...の様な小さな値を入れれば小数点以下の桁数は増えてゆきます。
ですから答えは「不定」です。

そもそも、doubleがどの値に近いかを判定するための仕様ではありません。
仕様の目的外使用をせずにご自分で何をもって切り捨て切り上げとするか(例えば四捨五入とか)を決定し、それに基づいた実装にすべきです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!