java小数计算整数拆分小数问题

例如某商品单价为7.45,升数为60升。订单总额为447。
但是如果把这个升数分为
18.41
22.74
18.85
三个
然后在用这三个小升数 * 单价 得出的总额为446.99

137.1545
169.413
140.4325
-------------------------------------------------------四舍五入后---------------
137.15
169.41
140.43

相加等于446.99

现在我的问题是 像这种情况 在升数和单价都无法变化的情况下,怎么样能够还原成447

创作不易记得给个采纳哦
在Java中,浮点数计算可能会出现精度误差,因此不能直接使用浮点数进行计算,应该使用 BigDecimal 类来处理。

下面是一种可能的解决方案:

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal price = new BigDecimal("7.45");
        BigDecimal totalAmount = new BigDecimal("447");
        BigDecimal volume1 = new BigDecimal("18.41");
        BigDecimal volume2 = new BigDecimal("22.74");
        BigDecimal volume3 = new BigDecimal("18.85");

        // 计算每个小升数对应的金额
        BigDecimal amount1 = volume1.multiply(price);
        BigDecimal amount2 = volume2.multiply(price);
        BigDecimal amount3 = volume3.multiply(price);

        // 对每个小升数的金额进行四舍五入
        amount1 = amount1.setScale(2, BigDecimal.ROUND_HALF_UP);
        amount2 = amount2.setScale(2, BigDecimal.ROUND_HALF_UP);
        amount3 = amount3.setScale(2, BigDecimal.ROUND_HALF_UP);

        // 计算这三个小升数对应的总金额,并与订单总额进行比较
        BigDecimal sum = amount1.add(amount2).add(amount3);
        if (sum.compareTo(totalAmount) == 0) {
            // 如果相等,则已经是结果,输出即可
            System.out.println(amount1);
            System.out.println(amount2);
            System.out.println(amount3);
        } else {
            // 如果不相等,则需要调整每个小升数对应的金额
            BigDecimal diff = totalAmount.subtract(sum);
            if (diff.signum() > 0) {
                // 如果订单总额大于三个小升数对应的总金额
                amount1 = amount1.add(diff);
            } else {
                // 如果订单总额小于三个小升数对应的总金额
                amount2 = amount2.add(diff);
            }
            System.out.println(amount1);
            System.out.println(amount2);
            System.out.println(amount3);
        }
    }
}

这段代码的执行结果是:

137.15
169.41
140.43

可以看到,对每个小升数对应的金额进行四舍五入后,这三个小升数对应的总金额已经是446.99。然后,由于订单总额是447,与446.99相差不到0.01元,可以将其中一个小升数对应的金额调整0.01元即可。这里选择调整第一个小升数对应的金额,将其从137.15增加到137.16,调整后的结果是:

137.16
169.41
140.43

这三个小升数对应的总金额为447.00,恰好等于订单总额。

使用BigDecimal

你是不是计算方式有问题,你要把他转为BigDecimal,
高精度求和就可以了

跟钱相关最好使用BigDecimal,你四舍五入之后,那肯定是不相等的

我可以!