我有许多字段接受输入,一个发生的过程,然后是显示输出的字段。我的问题是,由于某种原因,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");
}
答案 0 :(得分:13)
您的X
和Y
变量是int
,因此Java执行整数除法,此处除以6.这就是丢弃小数点的原因。 然后在转让给float
之前,它已转换为Z
。到达Math.round
时,小数点已经消失。
尝试将X
强制转换为float
以强制浮点除法:
float Z =((float) X + Y)/6;
这将保留Math.round
将用于正确舍入其输入的小数信息。
另一种方法是为float
指定一个6
字面值,这会强制X
和Y
的总和投放到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 |。