java.math.BigDecimal小缺陷

本文探讨了java.math.BigDecimal在执行除法操作时遇到无限循环小数情况下的异常处理机制。当使用BigDecimal进行如10除以3这类无法得到精确有限小数结果的运算时,会触发ArithmeticException。文章解释了此现象的原因,并提供了相应的解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.math.BigDecimal可以表示任意精度的有限位数值,可是表示不了无限循环小数。
当运算
new java.math.BigDecimal("10").divide(new java.math.BigDecimal("3"))
就会抛出ArithmeticException("Non-terminating decimal expansion; no exact representable decimal result.")
``` @Override public CommonResult<Page<HotelInfoVO>> getHotelListThree(HotelPageDTO dto) { SysUserRole sysUserRole = sysUserRoleService.getOne(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, dto.getUserId())); if (ObjectUtil.isEmpty(sysUserRole)) { return CommonResult.failed("账号信息异常,请联系技术人员"); } SysCompany sysCompany = sysCompanyMapper.selectById(dto.getCompanyId()); SysRole sysRole = sysRoleMapper.selectById(sysUserRole.getRoleId()); Page<HotelInfoVO> page = null; if (sysRole.getId() == 1) { //查询用户-公司关联关系 List<SysUserCompany> sysUserCompanyList = sysUserCompanyService.list( Wrappers.<SysUserCompany>lambdaQuery() .eq(SysUserCompany::getId, sysCompany.getId()) ); //获取sys_user_company关联记录 List<SysCompany> sysCompanyList = sysCompanyMapper.selectList(Wrappers.<SysCompany>lambdaQuery() .like(ObjectUtil.isNotEmpty(dto.getHotelName()), SysCompany::getCompanyName, dto.getHotelName()) .eq(SysCompany::getIsDelete, 0)); //获取id List<Long> id = sysCompanyList.stream() .map(SysCompany::getId) .collect(Collectors.toList()); //查询对应的sys_company信息,并根据valueName过滤 List<SysCompany> companies = sysCompanyMapper.selectList(Wrappers.<SysCompany>lambdaQuery() .in(SysCompany::getId, id) .like(ObjectUtil.isNotEmpty(dto.getHotelName()), SysCompany::getCompanyName, dto.getHotelName()) .eq(SysCompany::getIsDelete, 0)); //构建sys_company与sys_user_company之间的映射 Map<Long, SysCompany> companyMap = companies.stream() .collect(Collectors.toMap(SysCompany::getId, Function.identity())); // dataList = new ArrayList<>(); // recjargeAmountList =new ArrayLisy<>(); List<AddressBookVO> dataList = new ArrayList<>(); List<RechargeAmountVO> rechargeAmountList = new ArrayList<>(); //判断公司类型并输出 for (SysUserCompany userCompany : sysUserCompanyList) { SysCompany company = companyMap.get(userCompany.getCompanyId()); if (company != null && company.getCompanyType() == 3) { AddressBookVO addressBookVO = new AddressBookVO(); RechargeAmountVO rechargeAmountVO = new RechargeAmountVO(); addressBookVO.setUserId(userCompany.getUserId()); addressBookVO.setNameValue(company.getCompanyName()); rechargeAmountVO.getRechargeAmount(company.getRechargeAmount()); rechargeAmountList.add(rechargeAmountVO); } //分页 page = new Page<>(); page.setCurrent(1); page.setSize(10); } dataList.forEach(x -> x.setCount(dataList.size())); } return CommonResult.success(page); } } //rechargeAmountVO中的代码如下 package com.sd.admin.domain.vo.company; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class RechargeAmountVO { @ApiModelProperty("余额") private BigDecimal rechargeAmount; }```应为 0 个实参,但实际为 1 个,并查找修改不逻辑的地方
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值