为什么Java的Math.round总是向下取整?

5

我有多个需要输入的字段,经过一定的处理后输出结果。我的问题是,无论什么原因,math.round似乎总是向下舍入而不是四舍五入。

这里有一个例子:

private void method(){
    int X= Integer.parseInt(XjTF.getText());
    int Y= Integer.parseInt(YjTF.getText());

    float Z =(X+Y)/6;

    int output  =  Math.round(Z);

    OutputjTF.setText(Integer.toString(output)+" =answer rounded to closest integer");
}
1个回答

14

你的 XY 变量都是 int 类型的,所以在除以 6 的时候 Java 执行整数除法,这就是为什么小数点被舍去了。然后将其转换为 float 类型并赋值给 Z。当它传递到 Math.round 时,小数点已经被舍去了。

尝试将 X 强制转换为 float 以执行浮点除法:

float Z =((float) X + Y)/6;

这将保留十进制信息,以便Math.round正确地对其输入进行四舍五入。

另一种选择是为6指定一个float字面量,这将在除法之前强制将XY的总和转换为float

float Z = (X + Y)/6.0f;

它不能只是6.0,因为那是一个double字面值,当试图将double赋值给float时,Java编译器会抱怨“可能丢失精度”。

这里是来自JLS,第15.17.2节的相关引用:

整数除法向0舍入。也就是说,对于在二进制数字提升(§5.6.2)后是整数的操作数n和d产生的商是一个整数值q,其大小尽可能大,同时满足|d·q| ≤ |n|。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接