HALF_EVEN舍入不起作用

时间:2016-10-15 15:41:39

标签: java rounding decimalformat

我已经阅读了几篇关于使用十进制格式和舍入的文章,我认为我正确使用它,但不知何故HALF_EVEN,HALF_DOWN或HALF_UP舍入不起作用。 如果它与eclipse设置有关或者我是否真的错误地使用了小数格式,你有什么想法吗?

我的目标是将每个数字从.55到.6舍入,就像标准数学四舍五入一样。所以...正如我所假设的那样......最好的选择是用“HALF_UP”来回合。

代码:

import java.math.RoundingMode;
import java.text.DecimalFormat;

public class Rounding {

    public static void main(String[] args) {
        DecimalFormat df = new DecimalFormat();
        df.setMinimumFractionDigits(1);
        df.setMaximumFractionDigits(1);
        df.setRoundingMode(RoundingMode.HALF_UP);


        for (double x = 0.55; x < 10.0; x++) {
            System.out.println("Original value: " + x + "\tRounded value: " + df.format(x));
        }
    }
}

结果:

Original value: 0.55    Rounded value: 0,6
Original value: 1.55    Rounded value: 1,6
Original value: 2.55    Rounded value: 2,5
Original value: 3.55    Rounded value: 3,5
Original value: 4.55    Rounded value: 4,5
Original value: 5.55    Rounded value: 5,5
Original value: 6.55    Rounded value: 6,5
Original value: 7.55    Rounded value: 7,5
Original value: 8.55    Rounded value: 8,6
Original value: 9.55    Rounded value: 9,6

2 个答案:

答案 0 :(得分:2)

一旦你得到double格式的数字,你就已经创建了隐藏的不准确性,可以将数字舍入到中间标记之下或之上,而不会看到它。

您需要使用BigDecimal。

答案 1 :(得分:0)

To understand how this rounding works internally, add System.out.println("exact x: " + new BigDecimal(x)); inside the loop. It will print the exact value of x, compared to your current code, which only prints an approximate value.

When you understand what happens, fix your code by using integer arithmetic instead of floating point arithmetic wherever possible.