我是靠谱客的博主 勤劳金毛,最近开发中收集的这篇文章主要介绍Java死磕金钱0.01元,Java优雅的处理金钱问题,BigDecimal加减乘除保留精度,浮点数比较大小<====BigDecimal Java死磕金钱0.01元,Java优雅的处理金钱问题,浮点数加减乘除,浮点数比较大小<====BigDecimal购物车处理计算未支付总额浮点数乘法 Integer * Double工具类浮点数加减乘除,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
Java死磕金钱0.01元,Java优雅的处理金钱问题,浮点数加减乘除,浮点数比较大小<====BigDecimal
涉及浮点数,精度丢失是老生常谈的问题!BigDecimal工具类,提供了大量浮点数处理的方法!本文提供一种解决方案,仅供参考加减乘除,浮点数大小比较!
/**
* 单个店铺的打菜商品信息
* @param goodsIdWithGoods
* @param storeDto
* @param dishId
* @param goodsIdWithCarts
* @param listVO
*/
private void setOrderListVOProperty(Map<String, QueryGoodsByRoleData> goodsIdWithGoods, StoreDto storeDto, String dishId, Map<String,
List<ConsumerDishCartEntity>> goodsIdWithCarts, WeighOrderListDto listVO) {
List<ConsumerDishCartEntity> consumerDishCarts = goodsIdWithCarts.values().iterator().next();
ConsumerDishEntity dish = consumerDishService.findOne(consumerDishCarts.get(0).getConsumerDishId());
final long bindTime = dish.getBindTime();
listVO.setStoreName(storeDto.getStore_name());
listVO.setStoreId(storeDto.getId());
//打菜详情
WeightOrderItemDto item = new WeightOrderItemDto();
item.setBindTime(bindTime);
item.setDishId(dishId);
List<ItemGoodsDto> itemGoods = new ArrayList<>();
goodsIdWithCarts.forEach((goodsId, goodsCarts) -> {
QueryGoodsByRoleData goodsDto = goodsIdWithGoods.get(goodsId);
if (null !=goodsDto ) {
//按商品类型分类,其实已经是具体的某个goodsId了,这里是为了区分有更改称菜类型的异常操作
Map<Integer, List<ConsumerDishCartEntity>> sellTypeWithCarts = goodsCarts.stream().collect(Collectors.groupingBy(ConsumerDishCartEntity::getSellType));
sellTypeWithCarts.forEach((sellType, carts) -> {
//数量
int goodsNum = 0;
//重量
int totalWeight = 0;
//称重价格
BigDecimal weighPrice = BigDecimal.ZERO;
//按份价格
BigDecimal sinPrice = BigDecimal.ZERO;
if (sellType == GoodsConst.GoodsSellType.WEIGH.getValue()) {
//转成打菜机用的单位
BigDecimal price = covertToGram(goodsDto);
//总的数量
goodsNum = goodsNum + carts.size();
//该商品的总重量
totalWeight = totalWeight + carts.stream().mapToInt(ConsumerDishCartEntity::getGoodsWeight).sum();
if (goodsNum == 0) {
//商品数量为0时,不计入计价
carts.forEach(cart -> cart.setStatus(ConsumerDishCartEntity.STATUS_COMMIT_ERROR));
consumerDishCartService.save(carts);
return;
}
//该商品此次的总价格 及商品汇总信息
weighPrice = getTotalPrice(totalWeight,goodsDto);
ItemGoodsDto tg = new ItemGoodsDto();
tg.setGoodsId(goodsDto.getId());
tg.setGoodsImg(goodsDto.getImagePath());
tg.setGoodsName(goodsDto.getGoodsName());
tg.setGoodsWeigh(totalWeight);
tg.setPrice(price);
tg.setDiscountPrice(AlUtil.mul(price,goodsDto.getGoodsDiscount()));
tg.setStatus(WeighOrderListVO.WeightOrderItem.ItemGoods.STATUS_ON_SALE);
tg.setGoodsNum(goodsNum);
tg.setSellType(sellType);
itemGoods.add(tg);
} else if (sellType == GoodsConst.GoodsSellType.NUM.getValue()) {
//该商品的总数量
goodsNum = goodsNum + carts.stream().mapToInt(ConsumerDishCartEntity::getGoodsNum).sum();
totalWeight = totalWeight + carts.stream().mapToInt(ConsumerDishCartEntity::getGoodsWeight).sum();
if (goodsNum == 0) {
//商品数量为0时,不计入计价
carts.forEach(cart -> cart.setStatus(ConsumerDishCartEntity.STATUS_COMMIT_ERROR));
consumerDishCartService.save(carts);
return;
}
//按份 总价格
sinPrice = AlUtil.mul(new BigDecimal(String.valueOf(goodsNum)), goodsDto.getGoodsPrice());
ItemGoodsDto tg = new ItemGoodsDto();
tg.setGoodsId(goodsDto.getId());
tg.setGoodsImg(goodsDto.getImagePath());
tg.setGoodsName(goodsDto.getGoodsName());
tg.setGoodsWeigh(totalWeight);
tg.setPrice(goodsDto.getGoodsPrice());
tg.setStatus(WeighOrderListVO.WeightOrderItem.ItemGoods.STATUS_ON_SALE);
tg.setGoodsNum(goodsNum);
tg.setSellType(sellType);
itemGoods.add(tg);
} else {
log.error("商品类型错误-------------------");
}
//该商品的总共价格
BigDecimal total = AlUtil.add(weighPrice, sinPrice);
total = total.compareTo(BigDecimal.ZERO) == 0 ? new BigDecimal("0.01") : total;
listVO.setGoodsNum(listVO.getGoodsNum() + goodsNum);
listVO.setTotalWeight(listVO.getTotalWeight() + totalWeight);
listVO.setOrderAmount(AlUtil.add(listVO.getOrderAmount(),total));
});
} else {
//店铺商品列表找不到,即为下架/已删除商品
try {
//已下架商品,不处理
log.warn("已下架商品,不处理 goodsId:{}", goodsId);
} catch (Exception e) {
//抛出异常,即为已删除商品,处理该购物车
goodsCarts.forEach(goodsCart -> goodsCart.setStatus(ConsumerDishCartEntity.STATUS_COMMIT_ERROR));
consumerDishCartService.save(goodsCarts);
log.warn("已删除商品,处理该购物车 goodsCarts:{}", goodsCarts);
}
return;
}
listVO.getCartIds().addAll(goodsCarts.stream().map(ConsumerDishCartEntity::getId).collect(Collectors.toList()));
});
item.setItems(itemGoods);
listVO.getItems().add(item);
}
购物车处理
private List<WeighOrderListDto> getOrderListVOs(List<ConsumerDishCartEntity> userCarts) {
List<WeighOrderListDto> voList = new ArrayList<>();
//按店铺分类
String adminToken = adminTokenService.getBizCloudAdminTokenBearer();
Map<String, List<ConsumerDishCartEntity>> map = userCarts.stream().collect(Collectors.groupingBy(ConsumerDishCartEntity::getKitchenId));
map.forEach((key, value) -> {
if (CollectionUtils.isNotEmpty(value)) {
Map<String, QueryGoodsByRoleData> goodsIdWithGoods = getGoodsListMap(key,adminToken);
StoreDto storeDto = StoreUtils.getStoreByRole(key,adminToken);
//餐盘id分类
Map<String, List<ConsumerDishCartEntity>> dishIdWithCarts = value.stream().collect(Collectors.groupingBy(ConsumerDishCartEntity::getDishId));
dishIdWithCarts.forEach((dishId, carts) -> {
WeighOrderListDto listVO = getOrderListVO(goodsIdWithGoods, storeDto, dishId, carts);
if (listVO != null) {
listVO.setStoreId(key);
listVO.setMerchantId(storeDto.getMerchant_id());
log.info("debug# ORDER_RELATE_ONE_DISH -> WeighOrderListVO", listVO);
voList.add(listVO);
}
});
}
});
return voList;
}
private WeighOrderListDto getOrderListVO(Map<String, QueryGoodsByRoleData> goodsIdWithGoods, StoreDto storeDto, String dishId,
List<ConsumerDishCartEntity> dishCarts) {
if (dishCarts.isEmpty()) {
return null;
}
WeighOrderListDto listVO = new WeighOrderListDto();
listVO.setOrderState(BizConstant.BUSINESS_CLOUD.ORDER_UNPAY);
Map<String, List<ConsumerDishCartEntity>> keyWithCarts = dishCarts.stream().collect(Collectors.groupingBy(ConsumerDishCartEntity::getGoodsId));
//一个餐盘对应一个订单,key为goodsId
setOrderListVOProperty(goodsIdWithGoods, storeDto, dishId, keyWithCarts, listVO);
log.info("debug#getOrderListVO 1个餐盘对应一个订单 WeighOrderListVO:{}", listVO);
if (CollectionUtils.isEmpty(listVO.getItems())) {
return null;
}
return listVO;
}
计算未支付总额
public BigDecimal getUnPayTotalPrice(String username, String merchantId,String userToken,String kitchenId) {
List<ConsumerDishCartEntity> carts = consumerDishCartService.findAllByKitchenIdAndUsernameAndStatus(merchantId,
username, ConsumerDishCartEntity.STATUS_NO_COMMIT);
List<BuyerQueryOrderDto> list = queryBuyerOrders(BizConstant.BUSINESS_CLOUD.ORDER_UNPAY,merchantId,userToken);
log.info("debug#getUnPayTotalPrice:{}", list);
BigDecimal sum = BigDecimal.ZERO;
if (CollectionUtils.isNotEmpty(list)) {
//sum += list.stream().mapToDouble(BuyerQueryOrderDto::getOrder_amount).sum();
BigDecimal total = list.stream().map(BuyerQueryOrderDto::getOrder_amount).reduce(BigDecimal::add).get();
sum = AlUtil.add(sum, total);
}
String adminToken = adminTokenService.getBizCloudAdminTokenBearer();
Map<String, QueryGoodsByRoleData> goodsIdWithGoods = getGoodsListMap(kitchenId,adminToken);
if (CollectionUtils.isNotEmpty(carts)) {
for (ConsumerDishCartEntity cart : carts) {
QueryGoodsByRoleData goodsDto = goodsIdWithGoods.get(cart.getGoodsId());
log.info("debug#getUnPayTotalPrice-goodsIdWithGoods:{},cart:{}", goodsDto, cart);
// 商品被删掉,免单!
if (goodsDto == null) {
}
BigDecimal goodsPrice = goodsDto.getGoodsPrice() == null ? BigDecimal.ZERO : goodsDto.getGoodsPrice();
Integer weight = cart.getGoodsWeight() == null ? 0 : cart.getGoodsWeight();
BigDecimal total = AlUtil.mul(goodsPrice, new BigDecimal(String.valueOf(weight)));
sum = AlUtil.add(sum, total);
}
}
return sum;
}
浮点数乘法 Integer * Double
public BigDecimal getTotalPrice(Integer weight, QueryGoodsByRoleData goodsDto) {
return AlUtil.mul(new BigDecimal(String.valueOf(weight)), goodsDto.getGoodsPrice());
}
工具类浮点数加减乘除
public final class AlUtil {
/**
* 乘
* @param b1
* @param b2
* @return
*/
public static BigDecimal mul(BigDecimal b1, BigDecimal b2){
return b1.multiply(b2).setScale(2,BigDecimal.ROUND_HALF_UP);
}
/**
* 除
* @param b1
* @param b2
* @return
*/
public static BigDecimal divide(BigDecimal b1, BigDecimal b2){
return b1.divide(b2,4,BigDecimal.ROUND_HALF_UP);
}
/**
* 减
* @param b1
* @param b2
* @return
*/
public static BigDecimal subtract(BigDecimal b1, BigDecimal b2){
return b1.subtract(b2).setScale(2,BigDecimal.ROUND_HALF_UP);
}
/**
* 加
* @param b1
* @param b2
* @return
*/
public static BigDecimal add(BigDecimal b1, BigDecimal b2){
return b1.add(b2).setScale(2,BigDecimal.ROUND_HALF_UP);
}
}
最后
以上就是勤劳金毛为你收集整理的Java死磕金钱0.01元,Java优雅的处理金钱问题,BigDecimal加减乘除保留精度,浮点数比较大小<====BigDecimal Java死磕金钱0.01元,Java优雅的处理金钱问题,浮点数加减乘除,浮点数比较大小<====BigDecimal购物车处理计算未支付总额浮点数乘法 Integer * Double工具类浮点数加减乘除的全部内容,希望文章能够帮你解决Java死磕金钱0.01元,Java优雅的处理金钱问题,BigDecimal加减乘除保留精度,浮点数比较大小<====BigDecimal Java死磕金钱0.01元,Java优雅的处理金钱问题,浮点数加减乘除,浮点数比较大小<====BigDecimal购物车处理计算未支付总额浮点数乘法 Integer * Double工具类浮点数加减乘除所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复