【问题标题】:Can someone why this expression is evaluating to 40? [duplicate]有人能解释一下为什么这个表达式的值为 40 吗? [复制]
【发布时间】:2016-11-02 18:02:52
【问题描述】:

能否提供一些关于此代码输出 40 的原因的见解? 我尝试使用双精度而不是整数并使用 Math.round 方法 确保不是精度问题。

{
    int x,y ;
    x = ((( 80 + 80 + 80 + 80 + 80) / 500) * 100);
    y = ((x / 2) + (80 / 4) + (80 / 4));
    System.out.println(y);
}

我用计算器和我自己的脑袋计算了同样的表达式 总而言之,它应该是80!如果我犯了一个非常愚蠢的错误,我想 知道,但除此之外我只是好奇这是为什么以及如何解决它,提前谢谢!

【问题讨论】:

  • 您期望x 的值是多少,您检查过那部分吗?提示:你所有的操作都是整数,而 400/500 在整数算术中是 0...
  • 最终只有(80 / 4) + (80 / 4)很重要
  • 我认为@JonSkeet 在这里是正确的。在 Python 中,x 的计算结果为零,因为它是整数运算。

标签: java math evaluation


【解决方案1】:

你的 x 是 0 因为:

( 80 + 80 + 80 + 80 + 80) / 500) 计算结果为 0。

因此,y 变为 ((0 / 2) + (80 / 4) + (80 / 4)),其值为 40。

注意,当一个int类型在0到1之间时,就变成0了。

每条评论,在计算 400 / 500 时,x 是 int 还是 double 无关紧要,因为 400 和 500 是整数,所以 java 将首先应用 int 算术,然后继续。

【讨论】:

  • 那么该表达式的计算结果为 0.8,然后乘以 100,得到 80。
  • @AaronFisher:为什么你认为这个表达式会计算为 0.8?请参阅我对您的问题的评论。
  • @AaronFisher 0.8 不是整数。中间值也需要存储。
  • 0.8 被“转换”为 0,然后乘以 100。
  • 即使我使用双打,像这样 { double x,y ; x = ((( 80 + 80 + 80 + 80 + 80) / 500) * 100); y = ((x / 2) + (80 / 4) + (80 / 4)); System.out.println(y);我仍然只得到 40.0,而不是我期望的 80
【解决方案2】:

x = ((400)/500))* 100

这里 400/500 的计算结果为 0,因为 400 和 500 被视为整数

所以 y = 0 + (80/4) + (80/4) = 40

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2010-09-16
    • 2022-01-22
    • 2014-12-10
    相关资源
    最近更新 更多