为什么java math.round总是四舍五入?

时间:2013-05-28 23:34:42

标签: java math rounding

我有许多字段接受输入,一个发生的过程,然后是显示输出的字段。我的问题是,由于某种原因,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 个答案:

答案 0 :(得分:13)

您的XY变量是int,因此Java执行整数除法,此处除以6.这就是丢弃小数点的原因。 然后在转让给float之前,它已转换为Z。到达Math.round时,小数点已经消失。

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

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

这将保留Math.round将用于正确舍入其输入的小数信息。

另一种方法是为float指定一个6字面值,这会强制XY的总和投放到float之前除法:

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

它不能只是6.0,因为它是double字面值,并且Java编译器会在尝试将double分配给a时抱怨“可能会丢失精度” float

以下是JLS, Section 15.17.2的相关引用:

  

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