首页 文章

通过乘数减去和舍入双精度值

提问于
浏览
0

我有两个双重值

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

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

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

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

    编辑:使用 setScale() 设置一个合适的舍入模式通常是一个更好的选择,但你坚持使用乘数,对吧?

相关问题