舍入到最接近的0.05值的问题

时间:2011-06-13 15:29:56

标签: java double decimal rounding

已经有so many questions已经问过这个问题了。

一个流行的答案是使用以下公式。

  Math.ceiling(myValue * 20) / 20

我需要以下输出作为相应的输入。

     16.489 (input)   - 16.49(output)

使用上述公式

     16.489*20  = 329.78

     Math.ceil(329.78) = 330.0

     and 330.0 /20  = 16.5 

但我想要的是16.49。

理想情况下,Math.ceil的东西应该给出329.8

那么我们如何解决上述问题呢?还有许多类似的案例。

5 个答案:

答案 0 :(得分:5)

而不是乘以/除以2 * 10,你应该用10 2 来做。

但是,我建议您使用Math.round(100*a) / 100.0,或者如果您需要它来进行打印,printfDecimalFormat

<强>示例:

double input = 16.489;

// Math.round
System.out.println(Math.round(100 * input) / 100.0);

// Decimal format
System.out.println(new DecimalFormat("#.##").format(input));

// printf
System.out.printf("%.2f", input);

<强>输出

16.49
16.49
16.49

答案 1 :(得分:2)

为什么不使用Math.round()  格式化你的价值?

编辑:Math.round(值* 100.0)/ 100.0;

答案 2 :(得分:0)

我认为this可以帮到你。这个链接可以让你讨论如何将数字四舍五入到第n个小数位。

答案 3 :(得分:0)

将16.489舍入到最接近的0.05正确为16.5,其中16.45是下一个可能的最低值。

看到的行为是正确的。如果你想能够向上舍入到最接近的0.01那么

Math.ceiling(myValue * 100) / 100

将是一个更合适的解决方案。

答案 4 :(得分:-1)

试试这个

round(16.489, 2, BigDecimal.ROUND_CEILING);

public static double round(double x, int scale, int roundingMethod) {
        try {
            return (new BigDecimal
                   (Double.toString(x))
                   .setScale(scale, roundingMethod))
                   .doubleValue();
        } catch (NumberFormatException ex) {
            if (Double.isInfinite(x)) {
                return x;
            } else {
                return Double.NaN;
            }
        }
    }