Commons-math rounding double

时间:2017-07-31 07:18:05

标签: java apache-commons-math

我正在使用commons-math 3.6.1。

我需要将double值舍入为2十进制

我们假设这是我的双重值:

double d = 400.54540997260267;

现在通过舍入这个数字,我期待结果为400.54

相反,如果我的号码是d1 = 400.54640997260267;的两倍,我期待结果为400.55

现在我正在使用此代码:

Precision.round(d, 2, BigDecimal.ROUND_DOWN);

如果我使用roundingMethod BigDecimal.ROUND_DOWN我总是得到最低的舍入。我应该使用哪种舍入方法来获得我期望的结果?

我尝试了以下代码:

public class TestCalcoli

    {
        private static final Logger logger = LoggerFactory.getLogger(TestCalcoli.class.getName());
        private void calc(double d)
        {
            double result = Precision.round(d, 2, BigDecimal.ROUND_HALF_DOWN);
            double result2 = Precision.round(d, 2, BigDecimal.ROUND_HALF_UP);
            logger.info("d--> "+d+" result --> "+result+" result2 --> "+result2);
        }
        @Test
        public void calcola()
        {
            try
            {
                double d = 400.54540997260267;
                double d1 = 400.54640997260267;
                calc(d1);
                calc(d);
            }
            catch (Exception e)
            {
                logger.error("errore", e);
            }
        }
    }

CONSOLE OUTPUT:

2017-07-31 09:29:44,608 317  [main] INFO  i.e.c.r.pwb.test.TestCalcoli - d--> 400.54640997260265 result --> 400.55 result2 --> 400.55
2017-07-31 09:29:44,612 321  [main] INFO  i.e.c.r.pwb.test.TestCalcoli - d--> 400.54540997260267 result --> 400.55 result2 --> 400.55

3 个答案:

答案 0 :(得分:6)

如果要向上舍入相同的距离,即数字5,则应使用HALF_UP。

答案 1 :(得分:4)

以下是适用于您的问题的可用舍入方法及其对两个值的相应输出:

Method             400.54540997260267    400.54640997260267
---------------    ------------------    ------------------
ROUND_CEILING      400.55                400.55
ROUND_DOWN         400.54                400.54
ROUND_FLOOR        400.54                400.54
ROUND_HALF_DOWN    400.55                400.55
ROUND_HALF_EVEN    400.55                400.55
ROUND_HALF_UP      400.55                400.55
ROUND_UP           400.55                400.55

没有一种方法可以提供您期望的结果。

原因是400.54540997260267400.54640997260267的两个邻居是400.54400.55。这些邻居与400.54540997260267400.54640997260267的距离不等。因此,HALF舍入方法总是舍入到最近的邻居,在两种情况下都是400.55

借用xenteros'答案,可以连续使用两次舍入操作来实现所需的结果。首先向下舍入一个额外的精度数字,然后以所需的精度进行所需的舍入:

double truncated = Precision.round(input, 3, BigDecimal.ROUND_FLOOR);
double rounded = Precision.round(truncated, 2, BigDecimal.ROUND_HALF_DOWN);

答案 2 :(得分:1)

实现目标的最简单方法是执行以下操作:

double d = 400.54540997260267;
Double temp = 1000*d;
temp = 1.0*temp.intValue()/1000;
Precision.round(temp, 2, BigDecimal.HALF_DOWN);

它从第4个小数中删除数字,然后执行所需的舍入。