2017-07-14 1 views
1
public class sample { 

public static void main (String[] args) throws java.lang.Exception 
{ 
    int x; 
    x= (int) (2*3.3/1.1); 
    System.out.println(x); 
} 
} 

出力が5で6でない理由がわかりません。値を2.2、4.4に変更すると、4と8の望ましい値が得られます。 3.3の場合のみ、出力は一致しません。Javaディビジョンが期待した結果を得られていません

あなたの助けは非常にあなたはそれがフロートになり1.1で割るときダブル である6.6で

+2

で左5.999' 'のようなものであるため、' 2 * 3.3/1.1'結果もとで結果をint型にキャストすることができ'5' – danielspaniol

+1

3.3/1.1 => 2.9999999999999996 – mishadoff

答えて

1

2 * 3.3の結果を理解されるであろう。

精度の違いは、5.9999を得ることを意味....あなたはint型にキャストすると、小数点以下の桁は5

+2

「6.6は、1.1で割ったときに倍になり、浮動小数点になります。いいえ、それはまだ二倍です。 –

-1

であなたを残して切り落としますあなたは1.1と3.3を分割するとき、それはその結果だからです2.999999999999999996。したがって、2に掛け合わせると5.999999999999999という出力が得られます。次に、この結果をintにキャストします。つまり、小数点の直前にある桁を取ることになります。だからあなたの結果が出力5と、なぜ私は見つけることができません5.

+0

'2 * 3.3/1.1'は'(2 * 3.3)/ 1.1'を意味し、 '6.6/1.1'です。 –

+0

6.6を1.1で割った場合、結果は再び5.999999999999999になります。 – Zameer

0

ありません6、両方double値であるので、6.6/1.1除算結果がここに5.99999999999996.6ためと1.1

、なぜならコンピュータ上では、無限に正確な除算を行うことはできないので、この部門はおおよそのものです。

そしてときcast a double to an intそれは(int) 5.9999995なく6を与える理由です、このdoubleの小数部分を削除します。

ソリューション:

だからここに正確な値を得るために、あなたはこのようMath.round()メソッドを使用することができます。

x= (int) Math.round(2*3.3/1.1); 

これは、両方の状況の違いを示すLive Demoあります。

1

問題は、二重リテラルの値が正確に表現されていないことです。

double a = 6.6; 
    double b = 1.1; 

    System.out.println(Double.toHexString(a)); 
    System.out.println(Double.toHexString(b)); 
    System.out.println("xx: " + new BigDecimal(a)); 
    System.out.println("yy: " + new BigDecimal(b)); 

a = 6.6と宣言していますが、これは2進数で繰り返す小数です。したがって、切り詰められます。

0x1.a666666666666p2 
0x1.199999999999ap0 

これは16進数として表現を示し、最後の6を6滞在に切り捨てされている間、最後の「9」は、「A」まで丸められます。

その後、我々は、我々は、分子がちょうど6.6の下で近似ますと分母がちょうど1.1以上に近似します見ることができます `BigDecimalの

xx: 6.5999999999999996447286321199499070644378662109375 
yy: 1.100000000000000088817841970012523233890533447265625 

を使用して、実際の値をプリントアウトします。分割の結果

System.out.println(new BigDecimal(a/b)); 
#5.99999999999999911182158029987476766109466552734375 

その後intにキャストするだけで浮動小数点部分を切り捨て、およびあなたの5

関連する問題