可能是重复问题:
如何在Java中将整数转换为浮点数?
我遇到了这个代码的问题。
我有两个变量int i
和float f
。
int i = 23;
float f = i/10;
我认为f
变量中的值应该是2.3
但实际输出的f
值为2.0
为什么会出现这样的结果,我该如何得到浮点值2.3
可能是重复问题:
如何在Java中将整数转换为浮点数?
我遇到了这个代码的问题。
我有两个变量int i
和float f
。
int i = 23;
float f = i/10;
我认为f
变量中的值应该是2.3
但实际输出的f
值为2.0
为什么会出现这样的结果,我该如何得到浮点值2.3
float f = i/10
使用整数算术运算(分子和分母都是整数),然后将结果提升为float
类型。
如果您执行
float f = i/10f
那么您将会强制使用浮点运算(此时分母不再是整数)。连续的f
表示10f
被视为浮点数。指定10.0
或10d
则表示双精度。
double
(和编译错误),而不是 float
。应该是 i/10f。 - Dmitry Zaytsev输出结果为2.0f,因为分子和分母都是整数,所以使用了整数算术。
i/10
返回2
,当强制转换为float
时,变成了2.0f
。
您需要将分子或分母至少强制转换为float
,以进行浮点数除法。
int i = 23;
float f = (float)i/10;
或者
float f = i/10f;
float z = (float) x / y;
或者
float z = x / (float) y;
or(not required)
float z = (float) x / (float) y;
你可以将其视为一个两步操作
int i = 23;
int tmp = i/10;
// tmp = 2
float f = (float) tmp;
// f = 2.0f
这就是它在字节码中的样子
L0 //int i = 23;
BIPUSH 23
ISTORE 1 // var 1 is 'i'
L1 // int tmp = i/10;
ILOAD 1
BIPUSH 10
IDIV // integer division
ISTORE 2 // var 2 - is tmp
L2 // float f = (float) tmp;
ILOAD 2
I2F // (float) tmp
FSTORE 3 // var 3 is 'f'
int i = 1;
float f = (float) i;
请尝试使用i/1Of
代替i/10
float f = (float)i/10;
- Mysticial