問題は、二重リテラルの値が正確に表現されていないことです。
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
で左5.999' 'のようなものであるため、' 2 * 3.3/1.1'結果もとで結果をint型にキャストすることができ'5' – danielspaniol
3.3/1.1 => 2.9999999999999996 – mishadoff