“(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
为什么会这样?
答案 0 :(得分:1)
在乘法之后,转换为int
会截断小数点以外的任何内容,因此
3486.432456789
变为3486
,除以100以获得34
。这太过分了;不需要乘法或除法,只需:(int) amount
。然后返回值为double
,因此会隐式转换回double
:34.0
。
答案 1 :(得分:0)
因为它会转换为int
,因此会将值34.86...
截断为34
。整数不存储小数位,因此它只会截取小数点右边的任何内容。
但是,由于您返回double
,您的方法会转换您的值并添加额外的小数位:34.0
。
答案 2 :(得分:0)
这称为Narrowing Primitive Conversion。转换按照描述
完成在第一步中,浮点数转换为a long,如果T很长,或者是int,如果T是byte,short,char或int, 如下:
否则,如果浮点数不是无穷大,则 浮点值四舍五入为整数值V,向四舍五入 零使用IEEE 754舍入零模式(§4.2.3)。然后有 两种情况:
如果T很长,这个整数值可以表示为long, 那么第一步的结果就是长值V。
否则,如果此整数值可以表示为int,那么 第一步的结果是int值V。
所以
的价值(amount * 100)
属于double
类型,由于演员而被转换为int
。然后除以100
。由于您的方法被声明为返回double
,因此结果为widened,从int
到double
,具有以下规则:
[...]生成的浮点值将被正确舍入 使用IEEE 754舍入到最接近模式
的整数值的版本
答案 3 :(得分:0)
(int)
将分子转换为int。所以,你将有3486。/100
执行整数除法。你将有34岁。要实现您的目标,请执行浮点除法:
return (int)(amount * 100.0) / 100.0;