用乘数减去双精度值并四舍五入

Subtract and round double values by multiplier

我有两个双精度值

double a = 1.07522;
double b = 1.0752;

和舍入乘数值

public static final double ROUND_MULTIPLIER = 100000.0;

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

我需要减去两个双精度值并得到结果 a - b = 0.00002

如何使用 ROUND_MULTIPLIER 执行此操作?

我尝试使用 BigDecimal 作为

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

但它并不总是有效,有时 return 2E-16,当尝试添加到第二个值时它 return 是一个奇怪的值

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

我需要使用 ROUND_MULTIPLIER.

使用 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));
 BigDecimal decimal = new BigDecimal(1.07522);
 BigDecimal decimal1 = new BigDecimal(1.0752);
 System.out.println(decimal.subtract(decimal1).setScale(5, RoundingMode.DOWN));

BigDecimal 是要走的路,但为什么 ROUND_MULTIPLIER 无论如何都将其转换为 int 是双精度值。也许那是您从哪里得到四舍五入的问题?用 int-multiplier 试一试 :)

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

我不明白为什么你必须使用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

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