Java中ROUND_UP中的舍入模式问题

时间:2016-06-22 08:20:35

标签: java

我想使用ROUND_UP作为舍入模式。但是,当原始数字中的小数小于三位小时时,那么最后" 1"附上。

  int precision = 3;
  double[] values = { 1.9024999999999999, 2.1234, 2.2835, 2.04 };
  for (double value : values) {
     BigDecimal bd1 = new BigDecimal(value);
     bd1 = bd1.setScale(precision, BigDecimal.ROUND_UP);
     System.out.println(value + "===========" + bd1.doubleValue());
  }

输出如下 -

1.9024999999999999===========1.903

2.1234===========2.124

2.2835===========2.284

2.04===========2.041

2 个答案:

答案 0 :(得分:2)

  

但是,当原始数字中的小数小于3位小数时,则在末尾附加“1”。

您的2.04值不是真的 2.04。它实际上是2.04000000000000003552713678800500929355621337890625,这是最接近2.04的double值。因此,当你向上舍入时,它正确地向上舍入到2.041。

您正在使用BigDecimal(double)构造函数,几乎肯定不会按照您的意愿执行 - 请参阅documentation以获取有关它的警告。如果您改用BigDecimal.valueOf(double),它将按预期运行。

代码:

import java.math.BigDecimal;

public class Test {
    public static void main(String[] args) {
        int precision = 3;
        double[] values = { 1.9024999999999999, 2.1234, 2.2835, 2.04 };
        for (double value : values) {
            BigDecimal bd1 = BigDecimal.valueOf(value);
            bd1 = bd1.setScale(precision, BigDecimal.ROUND_UP);
            System.out.println(value + "===========" + bd1.doubleValue());
        }
    }
}

输出:

1.9024999999999999===========1.903
2.1234===========2.124
2.2835===========2.284
2.04===========2.04

答案 1 :(得分:0)

我的要求是 -

原始编号=================舍入编号

1.9024999999999999 =========== 1.903

1.8050000000000002 =========== 1.805

现在,通过提供的解决方案,我得到第一个数字正确。但是,不是第二个数字。你能解释一下这些情景吗?对于第二个数字,我的价值为1.806。