【问题标题】:Commons-math rounding doubleCommons-math 舍入双精度数
【发布时间】:2017-07-31 07:18:05
【问题描述】:

我正在使用 commons-math 3.6.1。

我需要将一个双精度值四舍五入到小数点后 2 位

假设这是我的双重价值:

double d = 400.54540997260267;

现在通过四舍五入我期望的结果400.54

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

现在我正在使用这个代码:

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

如果我使用 as 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);
            }
        }
    }

控制台输出:

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

【问题讨论】:

  • 提供你的代码肯定有帮助,但最好是作为一个简单的控制台应用程序,使用main 方法使其琐碎运行(无需进行测试环境启动并运行) - 并在每个测试用例中包含实际结果与预期结果。

标签: java apache-commons-math


【解决方案1】:

以下是适用于您的问题的可用舍入方法以及两个值各自的输出:

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】:

    如果你想四舍五入相同的距离,你应该使用 HALF_UP,即数字 5。

    【讨论】:

    • 如果这个答案甚至没有尝试回答 OP 问题,为什么会有这么多赞成?你至少读过这个问题吗? OP想要完全相反的东西
    【解决方案3】:

    实现你想要的最简单的方法是执行以下操作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多