乘以

时间:2017-01-25 12:03:07

标签: java numbers precision subtraction

我有两个双倍值

double a = 1.07522;
double b = 1.0752;

并舍入乘数值

public static final double ROUND_MULTIPLIER = 100000.0;

所以总是应该有5个小数位。

我需要减去两个double值并将结果作为a - b = 0.00002

如何使用ROUND_MULTIPLIER

执行此操作

我尝试使用BigDecimal作为

BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).round(new MathContext((int)ROUND_MULTIPLIER)); 

但它并不总是有效,有时会返回2E-16,当尝试添加第二个值时会返回奇怪的值,如下所示

BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b + 0.00002)).round(new MathContext((int)ROUND_MULTIPLIER));

我需要使用ROUND_MULTIPLIER

4 个答案:

答案 0 :(得分:1)

我不明白为什么你必须使用ROUND_MULTIPLYER以及它存在的确切原因是什么,所以我只能猜测。

强制代码使用ROUND_MULTIPLYER:

public static final double ROUND_MULTIPLIER = 100000.0;

public void foobar()
{
    double a = 1.07522;
    double b = 1.0752;

    BigDecimal opA = BigDecimal.valueOf(a);
    BigDecimal opB = BigDecimal.valueOf(b);

    BigDecimal result = opA.subtract(opB);

    result = result.multiply(BigDecimal.valueOf(ROUND_MULTIPLIER));

    int cutResult = result.intValue();

    result = BigDecimal.valueOf(cutResult / ROUND_MULTIPLIER);

    System.out.println(result);
}

这是

的输出
 0.000020

这就是你想要的吗?代码绝对是优化的对象,但我让你这样做; - )

答案 1 :(得分:0)

使用bigDEcimal并设置比例,给出您需要的小数位数

    final BigDecimal a = new BigDecimal(1.07522);
    final BigDecimal b = new BigDecimal(1.0752);
    final BigDecimal result = a.subtract(b);
    int newScale = 10; //10 decimals
    System.out.println(result.setScale(newScale, BigDecimal.ROUND_UP));

答案 2 :(得分:0)

 BigDecimal decimal = new BigDecimal(1.07522);
 BigDecimal decimal1 = new BigDecimal(1.0752);
 System.out.println(decimal.subtract(decimal1).setScale(5, RoundingMode.DOWN));

答案 3 :(得分:0)

BigDecimal是要走的路,但是如果你将 ROUND_MULTIPLIER 转换为int,为什么它是一个double值。也许这就是你从哪里得到你的问题?用int乘数给它一个旋转:)

编辑:使用setScale()设置正确的舍入模式通常是更好的选择,但是你坚持使用乘数,对吗?