BigDecimal,ROUND_UP的进位制
java.math包中提供的API类BigDecimal,对超过16位有效位的数进行精确的运算。BigDecimal.ROUND_UP,进位制:不管保留数字后面是大是小(0除外)都会进1。
案例代码:
public class BigDecimalDemo { public static void main(String[] args) { BigDecimal numOne = new BigDecimal("3.14959267"); BigDecimal numTwo = new BigDecimal("3.3205667"); BigDecimal numThree = new BigDecimal("3.3005667"); BigDecimal numOneRound = numOne.setScale(2, BigDecimal.ROUND_UP); System.out.println("numOneRound:" + numOneRound); // 3.15 BigDecimal numTwoRound = numTwo.setScale(2, BigDecimal.ROUND_UP); System.out.println("numTwoRound:" + numTwoRound); // 3.33 BigDecimal numThreeRound = numThree.setScale(2, BigDecimal.ROUND_UP); System.out.println("numThreeRound:" + numThreeRound); // 3.31 }}
商品单位的价格换算工具
之前 商品单位转换及单位换算功能 的基础上,商品单位设定其中一种类型的价格,其他价格已同时设定。
import java.math.BigDecimal;import java.util.LinkedHashMap;public class UnitPriceTools { /** * 设置一个单位的价格,自动生成所有的价格 * * @param unitGroupMap * @param unitType * @param unitPrice * @param model * @return */ public static LinkedHashMap<Integer, BigDecimal> toUnitPriceMapWithType(LinkedHashMap<Integer, Unit> unitGroupMap, int unitType, BigDecimal unitPrice, int model) { LinkedHashMap<Integer, BigDecimal> unitPriceMap = new LinkedHashMap<>(); if (unitType == 1) { // 单位类型1 unitPriceMap.put(1, unitPrice.setScale(2)); // 单位类型2 BigDecimal unitPrice2 = unitPrice.multiply(new BigDecimal(unitGroupMap.get(2).getUnitValue())).setScale(2); unitPriceMap.put(2, unitPrice2); // 单位类型3 BigDecimal unitPrice3 = unitPrice2.multiply(new BigDecimal(unitGroupMap.get(3).getUnitValue())).setScale(2); unitPriceMap.put(3, unitPrice3); // 单位类型4 BigDecimal unitPrice4 = unitPrice3.multiply(new BigDecimal(unitGroupMap.get(4).getUnitValue())).setScale(2); unitPriceMap.put(4, unitPrice4); } else if (unitType == 2) { // 单位类型1 BigDecimal unit1Price = unitPrice.divide(new BigDecimal(unitGroupMap.get(2).getUnitValue())); BigDecimal unit1RoundPrice = unit1Price.setScale(2, BigDecimal.ROUND_UP); if (model == 0) { unitPriceMap.put(11, unit1Price); unitPriceMap.put(1, unit1RoundPrice); } else { unitPriceMap.put(1, unit1RoundPrice); } // 单位类型2 unitPriceMap.put(2, unitPrice.setScale(2)); // 单位类型3 BigDecimal unitPrice3 = unitPrice.multiply(new BigDecimal(unitGroupMap.get(3).getUnitValue())).setScale(2); unitPriceMap.put(3, unitPrice3); // 单位类型4 BigDecimal unitPrice4 = unitPrice3.multiply(new BigDecimal(unitGroupMap.get(4).getUnitValue())).setScale(2); unitPriceMap.put(4, unitPrice4); } else if (unitType == 3) { // 单位类型2 BigDecimal unit2Price = unitPrice.divide(new BigDecimal(unitGroupMap.get(3).getUnitValue())); BigDecimal unit2RoundPrice = unit2Price.setScale(2, BigDecimal.ROUND_UP); if (model == 0) { unitPriceMap.put(21, unit2Price); unitPriceMap.put(2, unit2RoundPrice); } else { unitPriceMap.put(2, unit2RoundPrice); } // 单位类型1 BigDecimal unit1Price = unit2Price.divide(new BigDecimal(unitGroupMap.get(2).getUnitValue())); BigDecimal unit1RoundPrice = unit1Price.setScale(2, BigDecimal.ROUND_UP); if (model == 0) { unitPriceMap.put(11, unit1Price); unitPriceMap.put(1, unit1RoundPrice); } else { unitPriceMap.put(1, unit1RoundPrice); } // 单位类型3 unitPriceMap.put(3, unitPrice.setScale(2)); // 单位类型4 BigDecimal unitPrice4 = unitPrice.multiply(new BigDecimal(unitGroupMap.get(4).getUnitValue())).setScale(2); unitPriceMap.put(4, unitPrice4); } else if (unitType == 4) { // 单位类型3 BigDecimal unit3Price = unitPrice.divide(new BigDecimal(unitGroupMap.get(4).getUnitValue())); BigDecimal unit3RoundPrice = unit3Price.setScale(2, BigDecimal.ROUND_UP); if (model == 0) { unitPriceMap.put(31, unit3Price); unitPriceMap.put(3, unit3RoundPrice); } else { unitPriceMap.put(3, unit3RoundPrice); } // 单位类型2 BigDecimal unit2Price = unit3Price.divide(new BigDecimal(unitGroupMap.get(3).getUnitValue())); BigDecimal unit2RoundPrice = unit2Price.setScale(2, BigDecimal.ROUND_UP); if (model == 0) { unitPriceMap.put(21, unit2Price); unitPriceMap.put(2, unit2RoundPrice); } else { unitPriceMap.put(2, unit2RoundPrice); } // 单位类型1 BigDecimal unit1Price = unit2Price.divide(new BigDecimal(unitGroupMap.get(2).getUnitValue())); BigDecimal unit1RoundPrice = unit1Price.setScale(2, BigDecimal.ROUND_UP); if (model == 0) { unitPriceMap.put(11, unit1Price); unitPriceMap.put(1, unit1RoundPrice); } else { unitPriceMap.put(1, unit1RoundPrice); } // 单位类型4 unitPriceMap.put(4, unitPrice.setScale(2)); } return unitPriceMap; } /** * @param unitGroupMap * @param unitType * @param unitPrice * @return */ public static LinkedHashMap<Integer, BigDecimal> toUnitPriceMapWithType(LinkedHashMap<Integer, Unit> unitGroupMap, int unitType, BigDecimal unitPrice) { return toUnitPriceMapWithType(unitGroupMap, unitType, unitPrice, 1); }}
工具类测试:
import java.math.BigDecimal;import java.util.LinkedHashMap;import java.util.List;public class UnitPriceToolsTest { public static void main(String[] args) { // 准备商品 Long goodsId = 1000L; // 准备商品单位列表 List<Unit> unitList = UnitConvertService.getUnitList(goodsId); // =======================================================================================// // >>>>>>>>>>>> 按类型分组返回保证顺序的Map(根据单位类型) LinkedHashMap<Integer, Unit> unitGroupMap = UnitConvertTools.toUnitMapWithType(goodsId, unitList); System.out.println("按类型分组返回保证顺序的Map(根据单位类型) = " + unitGroupMap); LinkedHashMap<Integer, BigDecimal> unitType1PriceMap = UnitPriceTools.toUnitPriceMapWithType(unitGroupMap, 1, new BigDecimal("1.11")); System.out.println("单位类型1,价格 = " + unitType1PriceMap); LinkedHashMap<Integer, BigDecimal> unitType2PriceMap = UnitPriceTools.toUnitPriceMapWithType(unitGroupMap, 2, new BigDecimal("44.14"), 0); System.out.println("单位类型2,价格 = " + unitType2PriceMap); LinkedHashMap<Integer, BigDecimal> unitType3PriceMap = UnitPriceTools.toUnitPriceMapWithType(unitGroupMap, 3, new BigDecimal("444.10"), 0); System.out.println("单位类型3,价格 = " + unitType3PriceMap); LinkedHashMap<Integer, BigDecimal> unitType4PriceMap = UnitPriceTools.toUnitPriceMapWithType(unitGroupMap, 4, new BigDecimal("8888"), 0); System.out.println("单位类型4,价格 = " + unitType4PriceMap); }}
测试输出内容:
单位类型1,价格 = {1=1.11, 2=44.40, 3=444.00, 4=8880.00}单位类型2,价格 = {11=1.1035, 1=1.11, 2=44.14, 3=441.40, 4=8828.00}单位类型3,价格 = {21=44.41, 2=44.41, 11=1.11025, 1=1.12, 3=444.10, 4=8882.00}单位类型4,价格 = {31=444.4, 3=444.40, 21=44.44, 2=44.44, 11=1.111, 1=1.12, 4=8888.00}