我正在使用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
答案 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.54540997260267
和400.54640997260267
的两个邻居是400.54
和400.55
。这些邻居与400.54540997260267
或400.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个小数中删除数字,然后执行所需的舍入。