Java计算
为什么:Java计算,java,Java,为什么: System.out.println((3 + 7 + 10) * (1000 - 8) / (992 - 17)) 打印3而不是20 System.out.println (2.0 + 1.0/2 + 1.0/6 + 1.0/24 + 1.0/120) 打印2.716663而不是2.71667 System.out.println (2147483647 + 1) 打印-2147483648而不是2147483648 System.out.println((3 + 7 + 10
System.out.println((3 + 7 + 10) * (1000 - 8) / (992 - 17))
打印3
而不是20
System.out.println (2.0 + 1.0/2 + 1.0/6 + 1.0/24 + 1.0/120)
打印2.716663
而不是2.71667
System.out.println (2147483647 + 1)
打印-2147483648
而不是2147483648
System.out.println((3 + 7 + 10) * (1000 - 8) / 992 - 17)
这打印3而不是20,因为。。。基础数学
- 3+7+10=20
- 1000-8=992
- 20*992/992-17=20-17
- 20-17=3
这是一个浮点精度错误
整数溢出
(3+7+10)*(1000-8)/992-17
是20*992/992-17
,它归结为20-17
,因此是3
,而不是20
0x7fffffff
0x7fffffff+1
是0x8000000
,或者换句话说,-2147483648
溢出。Java中整数的最大值为2^31-1或2147483647。当您向该值添加一个值时,它将环绕到您看到的值。它与使用的值的二进制表示有关。无法理解第一个print语句试图传达的内容,输出中没有任何错误。在第三种情况下,int为32位,数字超出范围。在大数字后加一个l(要处理的长度相同),以获得正确的输出。关于#3:
如果使用长字符,System.out.println(2147483647+1)将打印出2147483648。每个变量类型都有一个最大容量 第一个应该打印
3
…您希望看到什么?查看有关运算符优先级的Java教程:@OpMt我不理解您的编辑。@OpMt您意识到您在上次编辑中添加的括号不正确,对吗?添加括号后,第一条语句的值是20,而不是3。如果没有添加括号,则值为3,而不是20。括号会影响操作的执行顺序,从而影响结果。因此对于整数溢出,为什么它会变成负数?@OpMt:因为2147483647
是0B01111111111111111111111
,它会溢出到0b10000000000000000000000000000000
,这是-2147483648
作为有符号的2的补码,32位整数,这就是int
的含义。@Nambari这是不正确的。它与二进制表示法和。该行为定义明确且易于理解。与此问题相关的两个有趣且有用的链接:
System.out.println (2.0 + 1.0/2 + 1.0/6 + 1.0/24 + 1.0/120)
System.out.println (2147483647 + 1)