0

"(int)" 在下面的 return 语句中实际上做了什么?

public double calc(double amount){
    return (int)(amount * 100)/100;
}

我期望这个方法会返回与传入的值相同的值,因为我乘以 100 然后除以 100 。. . 当我在错误的编译器中测试时,让我回到原来的值。例如:

    carInformation myCar = new carInformation("");
    System.out.println(myCar.calc(34.86432456789));

我得到:

34.0

为什么会这样?

4

4 回答 4

1

乘法之后,转换为int截断小数点后的任何内容,因此 3486.432456789变为3486,除以 100 得到34。这是矫枉过正; 不需要乘法或除法,只需:(int) amount. 然后返回值为 a double,因此它被隐式转换回 a double: 34.0

于 2013-10-07T19:48:47.947 回答
0
  • (int)分子转换为 int。因此,您将拥有 3486。
  • 执行/100整数除法。你将有 34 个。

要实现您想要的,请执行浮点除法:

return (int)(amount * 100.0) / 100.0;
于 2013-10-07T20:21:02.247 回答
0

因为它被强制转换为int,它会将值截断34.86...34。整数不存储小数位,所以它只是去掉小数点右边的任何东西。

但是由于您返回 a double,因此您的方法会转换您的值并添加额外的小数位:34.0.

于 2013-10-07T19:47:26.243 回答
0

这称为Narrowing Primitive Conversion。如所述完成转换

第一步,浮点数转换为 long(如果 T 为 long)或转换为 int(如果 T 为 byte、short、char 或 int),如下所示:

否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 节)向零舍入。那么有两种情况:

如果 T 是 long,并且这个整数值可以表示为 long,那么第一步的结果就是 long 值 V。

否则,如果这个整数值可以表示为 int,那么第一步的结果就是 int 值 V。

所以价值

(amount * 100)

类型double为 , 由于强制转换而转换为 a int。然后除以100。因为您的方法被声明为返回 a ,所以使用以下规则double将该结果从扩大int到:double

[...] 得到的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式

于 2013-10-07T19:51:37.287 回答