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");
}
4

1 回答 1

14

你的XY变量是int,所以 Java 执行整数除法,这里除以 6 时。这就是去掉小数点的原因。 然后float它在分配给之前转换为 a Z。到 时Math.round,小数点已经消失了。

尝试X强制float浮点除法:

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

这将保留Math.round用于正确舍入其输入的十进制信息。

另一种方法是指定一个float文字 for 6,这将强制 和 的总和X在除法之前强制Y转换:float

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

它不能只是6.0,因为这是一个文字,Java 编译器在尝试将 a 分配给adouble时会抱怨“可能丢失精度” 。doublefloat

以下是JLS 第 15.17.2 节的相关引述:

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

于 2013-05-28T23:37:06.800 回答