2017-07-14 52 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分部没有给出预期的结果

您的帮助将得到高度赞赏在6.6这是一个双 当您通过1.1除以它会导致浮动

+2

可能是因为'2 * 3.3/1.1'导致像'5.999'和铸造为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

这是因为当你把3.3 1.1,它导致2.9999999999999996。所以当它乘以2时,它会给出5.999999999999999的输出。然后你将这个结果转换为int,意味着它将会在小数点前面产生数字。所以,你的结果是5

+0

'2 * 3.3/1.1'意思是'(2 * 3.3)/ 1.1',它是'6.6/1.1'。 –

+0

如果用1.1除以6.6,结果是5.999999999999999。 – Zameer

0

我无法找出原因输出为5,而不是6

这是因为6.61.1都是double值,所以6.6/1.1划分结果是5.9999999999999在这里,因为在电脑上,这个部门是近似的,因为你无法做无限精确的划分。

当你cast a double to an int它丢弃这个double的小数部分,这就是为什么(int) 5.9999995而不是6

解决方案:

所以在这里为了得到确切值,你可以使用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它是二进制重复小数。因此它被截断。

0x1.a666666666666p2 
0x1.199999999999ap0 

这显示了表示为十六进制,最后的“9”四舍五入至“A”,而最后6四舍五入留六人。

然后,我们用`BigDecimal的

xx: 6.5999999999999996447286321199499070644378662109375 
yy: 1.100000000000000088817841970012523233890533447265625 

我们可以看到分子被作为不到6.6近似分母得到近似刚刚超过1.1打印出的实际值。分工的结果。

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

然后铸造int刚截断浮点的一部分,你的左边有5

相关问题