【问题标题】:Unexpected result while dividing int by int and storing result into double [duplicate]将int除以int并将结果存储为double时出现意外结果[重复]
【发布时间】:2013-04-26 14:10:33
【问题描述】:

我遇到了一个奇怪的问题。

此代码只是将一个 int 除以另一个 int,将结果存储在一个 double 变量中并打印出来:

int a = 200;
int b = 557;

double divisionResult = a / b;

System.out.println("Result: " + divisionResult);

执行这段代码后,输出为:

Result: 0

这很奇怪,因为200/5570.3590664272890485

我注意到如果我将ab 转换为double 在除法行中

double divisionResult = (double) a / (double) b;

效果很好。

为什么我必须将变量加倍才能得到真正的除法结果?

【问题讨论】:

  • 这很正常。来自int/int=int 的结果。如果要更改结果类型,则需要将至少一个参数的类型更改为浮点数,例如 floatdouble
  • 请注意,您必须强制转换两个操作数中的一个来强制双除

标签: java int double division


【解决方案1】:

因为在整数除法中,如果答案不是完美整数,小数点后的数字将被删除(整数除法产生整数值)。

请注意,您不必同时转换两个整数,您只能转换一个,第二个将被隐式转换。

为什么在演员表之后它起作用了?

因为 cast 的优先级高于 /。所以它首先投射,然后分裂。如果不是这种情况,您将收到0.0

【讨论】:

  • 即使cast 的优先级低于/,OP 的除法仍然有效,因为无论如何都会强制转换正确的操作数。
【解决方案2】:

与往常一样,赋值运算符右侧的任何计算都会在将其结果分配给左侧指定的变量之前执行。执行计算时,它是两个ints 之间的除法,这是一个整数除法,(我相信你知道)产生一个整数结果(即没有任何余数的商)。只有在执行此计算之后,整数除法的结果(即 0)才会转换为双精度数。

正如您所观察到的,将ints 中的一个或两个更改为双精度数会使计算成为双除法,而不是整数除法。

【讨论】:

    【解决方案3】:

    a 是 int,b 是 int,a/b 相除得到一个 int 值,所以 0.35 转换为 int 就变成了 0。所以你必须像这样转换它

    double d = (double)a/b;
    

    【讨论】:

    • 请注意,这只是因为cast operator的优先级高于division operator,乍一看并不明显。
    【解决方案4】:

    因为你现在的做法是这样的:

    你对 a 和 b 进行整数除法。结果是整数 0。然后将结果分配给 double。

    您可以将 a 或 b 转换为 double,Java 会识别并给您一个 double 作为结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-07
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多