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
  • 浮点运算本质上是不准确的
  • 签名溢出是Java中定义良好的行为<代码>2147483647在Java中是
    0x7fffffff
    0x7fffffff+1
    0x8000000
    ,或者换句话说,
    -2147483648
  • 系统输出打印LN((3+7+10)*(1000-8)/992-17)打印3而不是20

    。首先计算括号,得到(20)*(992)/992-17。然后,从左到右乘除得到20-17。最后,减法得到3

    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)print-2147483648而不是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)