BigDecimal.add方法不生效

本文深入探讨了BigDecimal的加法操作。通过分析源码,揭示了为何直接调用add方法无法改变原有对象值的原因,强调了使用赋值操作来获取加法结果的重要性。

代码一:

BigDecimal theory_score = new BigDecimal(0.0);
theory_score.add(bdJobContentAnswer.getScore());
//bdJobContentAnswer.getScore 为20.0

结果:theory_score = 0.0
代码二:

BigDecimal theory_score = new BigDecimal(0.0)
public boolean efficiencyCalculation(MlbLinePlanningRecord mlbLinePlanningRecord) { System.out.println(); // 查询所有相同的计算结果 int index = 0; List<MlbLinePlanningRecord> list = mlbLinePlanningRecordMapper.selectMlbLinePlanningRecordList(mlbLinePlanningRecord); Long[] ids = new Long[list.size()]; for (MlbLinePlanningRecord item : list) { ids[index] = item.getId(); index++; } // 临时储存数据 String remainVersion = mlbLinePlanningRecord.getVersion(); String remainChildTaskNo = mlbLinePlanningRecord.getChildTaskNo(); MlbFatpLineNumberPlanning mlbFatpLineNumberPlanning = new MlbFatpLineNumberPlanning(); mlbFatpLineNumberPlanning.setModel(mlbLinePlanningRecord.getModel()); mlbFatpLineNumberPlanning.setTaskNo(mlbLinePlanningRecord.getTaskNo()); mlbFatpLineNumberPlanning.setProductType(mlbLinePlanningRecord.getProductType()); List<MlbFatpLineNumberPlanning> result = mlbFatpLineNumberPlanningMapper.selectMlbFatpLineNumberPlanningList(mlbFatpLineNumberPlanning); if (result.size() > 0) { int size = result.size(); mlbLinePlanningRecord.setVersion(result.get(size - 1).getVersion()); mlbLinePlanningRecord.setChildTaskNo(result.get(size - 1).getChildTaskNo()); } // 首先先去获取FATP产能 比如为876000 MlbLinePlanningRecord fatpList = mlbLinePlanningRecordMapper.getFatpCapacity(mlbLinePlanningRecord); if (fatpList == null || fatpList.getWeekCapacity() == null) { throw new CustomException("FATP线数规划暂无数据"); } mlbLinePlanningRecord.setEfficiency(fatpList.getWeekCapacity().divide(BigDecimal.valueOf(1000))); // mlbLinePlanningRecord.setEfficiency(BigDecimal.valueOf(876000/1000)); // 获取原来的值 mlbLinePlanningRecord.setVersion(remainVersion); mlbLinePlanningRecord.setChildTaskNo(remainChildTaskNo); // 获取MLB 制程线体的产能 List<MlbLinePlanningRecord> mlbCapacityList = mlbLinePlanningRecordMapper.getMlbCapacity(mlbLinePlanningRecord); try { for (MlbLinePlanningRecord row : mlbCapacityList) { BigDecimal mlbTargetCapacity = row.getWeekCapacity(); // MLB 目标周产能 MlbLinePlanningRecord planParams = new MlbLinePlanningRecord(); planParams.setProcessLineName(row.getProcessLineName()); // 制程线体名 planParams.setWeekCapacity(row.getWeekCapacity()); // mlb 制程线的单周产能 planParams.setProductType(mlbLinePlanningRecord.getProductType()); planParams.setModel(row.getModel()); // 获取线体数量 List<MlbLinePlanningRecord> lineData = mlbLinePlanningRecordMapper.getLineEfficiency(planParams); boolean lastItem = false; // 最后条件的线体数是否为空(默认不为空) BigDecimal currentNum = BigDecimal.valueOf(0); // 最后一个条件前的产能加总 BigDecimal lastRemainCapacity = BigDecimal.valueOf(0); // 临时产能 BigDecimal allLine; // 总线体 BigDecimal needLine = BigDecimal.valueOf(0); // 所需线体 BigDecimal setLine = BigDecimal.valueOf(0); // 设置了的线体数 // 查询方案并计算结果 以百分百效率进行估算 planParams.setEfficiency(BigDecimal.valueOf(1)); List<MlbLinePlanningRecord> planList = mlbLinePlanningRecordMapper.getSolution(planParams); // 判断减去前面所有的条件后产能还差多少进行估算需要新增的线体 if (planList.size() > 0) { for (MlbLinePlanningRecord item : planList) { // 当最后一条线体没有设置线体数时 if (item.getLineNumber() == null || item.getLineNumber().compareTo(BigDecimal.valueOf(0)) == 0) { lastRemainCapacity = item.getUph().multiply(item.getDailyHours()).multiply(item.getWeekWorkDay()).multiply(planParams.getEfficiency()); lastItem = true; break; } setLine = setLine.add(item.getLineNumber()); currentNum = currentNum.add(item.getWeekCapacity()); // 当设置的方案产能大于目标产则跳出 if (currentNum.compareTo(mlbTargetCapacity) >= 0) { break; } } } else { continue; } // 最后一个条件是否为空 if (lastItem) { BigDecimal remainNum = row.getWeekCapacity().subtract(currentNum); // 总产能相差的值 // 计算百分百效率下还需要多少线体 needLine = (row.getWeekCapacity().subtract(currentNum).multiply(BigDecimal.valueOf(1000)).divide(lastRemainCapacity, 0, RoundingMode.UP)); allLine = setLine.add(needLine); } else { allLine = setLine; } planParams.setLineNumber(allLine); // 进行循环计算 List<MlbLinePlanningRecord> capacityMap; // 当最后的条件线体数为空时 if (lastItem) { while (true) { // 产能计算 capacityMap = capacityCheckCalculation(planParams, needLine, mlbTargetCapacity, true); // 当产能大于等于目标产能就跳出循环 BigDecimal capacityCheck = BigDecimal.valueOf(0); for (MlbLinePlanningRecord item : capacityMap) { capacityCheck = capacityCheck.add(item.getWeekCapacity()); } if (capacityCheck.compareTo(mlbTargetCapacity) >= 0) { break; } else { needLine = needLine.add(BigDecimal.valueOf(1)); allLine = allLine.add(BigDecimal.valueOf(1)); planParams.setLineNumber(needLine); } // 超出线体数跳出循环 if (allLine.compareTo(BigDecimal.valueOf(lineData.size())) >= 0) { break; } } } else { // 当条件不必为空时 capacityMap = capacityCheckCalculation(planParams, needLine, mlbTargetCapacity, false); } System.out.println(capacityMap); if (capacityMap.size() > 0) { for (MlbLinePlanningRecord item : capacityMap) { item.setPlan(item.getRemark()); item.setActId(mlbLinePlanningRecord.getActId()); item.setTaskNo(mlbLinePlanningRecord.getTaskNo()); item.setChildTaskNo(mlbLinePlanningRecord.getChildTaskNo()); item.setProductType(mlbLinePlanningRecord.getProductType()); item.setModel(mlbLinePlanningRecord.getModel()); item.setVersion(mlbLinePlanningRecord.getVersion()); item.setDailyCapacity(item.getDailyCapacity().multiply(BigDecimal.valueOf(1000))); item.setWeekCapacity(item.getWeekCapacity().multiply(BigDecimal.valueOf(1000))); if (ids != null && ids.length > 0) { mlbLinePlanningRecordMapper.deleteMlbLinePlanningRecordByIds(ids); } mlbLinePlanningRecordMapper.insertMlbLinePlanningRecord(item); } } } } catch (Exception e) { throw new CustomException("计算错误:" + e.getMessage()); } return true; } /** * 计算产能 * 实际产能计算 * * @param mlbLinePlanningRecord 参数 * @param needLine 需求线体 * @return */ public List<MlbLinePlanningRecord> capacityCheckCalculation(MlbLinePlanningRecord mlbLinePlanningRecord, BigDecimal needLine, BigDecimal targetCapacity, boolean isCheck) { List<MlbLinePlanningRecord> result = new ArrayList<>(); System.out.println(needLine); Boolean isClear = false; // 是否要清除值 BigDecimal capacity = BigDecimal.valueOf(0); // 当前产能 BigDecimal efficiency; // 当前效率 // 获取目前线数的效率 List<MlbLinePlanningRecord> list = mlbLinePlanningRecordMapper.getLineEfficiency(mlbLinePlanningRecord); if (list.size() > 0 && list.get(0).getEfficiency() != null) { efficiency = list.get(0).getEfficiency().setScale(4, RoundingMode.DOWN); } else { return result; } mlbLinePlanningRecord.setEfficiency(efficiency); List<MlbLinePlanningRecord> planList = mlbLinePlanningRecordMapper.getSolution(mlbLinePlanningRecord); System.out.println(planList); if (planList.size() > 0) { for (MlbLinePlanningRecord row : planList) { if (row.getLineNumber() == null || row.getLineNumber().compareTo(BigDecimal.valueOf(0)) == 0) { row.setLineNumber(needLine); // 单日产能 BigDecimal dailyCapacity = (row.getUph().multiply(row.getDailyHours()).multiply(efficiency).multiply(needLine)).divide(BigDecimal.valueOf(1000)); row.setDailyCapacity(dailyCapacity.setScale(6, RoundingMode.HALF_UP)); // 周产能 BigDecimal tempCapacity = dailyCapacity.multiply(row.getWeekWorkDay()).setScale(6, RoundingMode.HALF_UP); row.setWeekCapacity(tempCapacity); capacity = capacity.add(tempCapacity); } else { capacity = capacity.add(row.getWeekCapacity()); } if (capacity.compareTo(targetCapacity) >= 0) { if (!isCheck && isClear) { row.setWeekCapacity(BigDecimal.valueOf(0)); row.setDailyCapacity(BigDecimal.valueOf(0)); // 当满足后不在计算和保留后面的数据 return result; } isClear = true; } row.setEfficiency(efficiency.multiply(BigDecimal.valueOf(100))); result.add(row); } } return result; } 请帮我检查以上代码哪里有可以优化的空间, List<MlbLinePlanningRecord> planList = mlbLinePlanningRecordMapper.getSolution(mlbLinePlanningRecord);这个方法获取到的值中部分字段没有,但是打印出来后反而有值了,请帮我看看是什么问题导致
最新发布
09-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值