TaoYuan_DuDu 2023-05-31 10:52 采纳率: 100%
浏览 29
已结题

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

  • 写回答

5条回答 默认 最新

  • 全栈若城 全栈领域优质创作者 2023-05-31 11:04
    关注

    创作不易记得给个采纳哦
    在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,恰好等于订单总额。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 6月8日
  • 已采纳回答 5月31日
  • 创建了问题 5月31日

悬赏问题

  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费