JavaSE——常用API进阶二(2/8)-BigDecimal(BigDecimal的常见构造器、常用方法,用法示例,使用规范)

简介: JavaSE——常用API进阶二(2/8)-BigDecimal(BigDecimal的常见构造器、常用方法,用法示例,使用规范)

在进行浮点型运算时,直接使用“ + - * / ”可能会出现运算结果失真,例如:

System.out.println(0.1 + 0.2);
System.out.println(1.0 - 0.32);
System.out.println(1.015 * 100);
System.out.println(1.301 / 100);

运行结果:



诸如这些情况,就是出现了结果失真的问题。

BigDecimal类就是为了解决这个问题的。

BigDecimal

  • 用于解决浮点型运算时,出现结果失真的问题。

BigDecimal的常见构造器、常用方法

构造器 说明
public BigDecimal(double val) 注意:不推荐使用这个 将double转换为BigDecimal
public BigDecimal(String val) 把string转成BigDecimal

图片.png

用法示例

public class Test {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
//        BigDecimal a1 = new BigDecimal(Double.toString(a));
//        BigDecimal b1 = new BigDecimal(Double.toString(b));
        //推荐使用以下方式,把小数转换成字符串再得到BigDecimal对象来使用(更简洁)
        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);
 
        BigDecimal c1 = a1.add(b1);
        System.out.println(c1);
 
    }
}

运行结果:


(没有出现运算结果失真)

其他方法

public class Test {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
//        BigDecimal a1 = new BigDecimal(Double.toString(a));
//        BigDecimal b1 = new BigDecimal(Double.toString(b));
        //推荐使用以下方式,把小数转换成字符串再得到BigDecimal对象来使用(更简洁)
        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);
 
        BigDecimal c1 = a1.add(b1);
        System.out.println(c1);
 
        BigDecimal c2 = a1.subtract(b1); //减法
        BigDecimal c3 = a1.multiply(b1); //乘法
        BigDecimal c4 = a1.divide(b1);  //除法
 
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
 
    }
}

运行结果:


注意:对于除法,如果无法除尽,会因无法确定精度而报错。

public class Test {
    public static void main(String[] args) {
        BigDecimal i = BigDecimal.valueOf(0.1);
        BigDecimal j = BigDecimal.valueOf(0.3);
        BigDecimal k = i.divide(j); //除不尽
    }
}
 


解决办法:

public class Test {
    public static void main(String[] args) {
        BigDecimal i = BigDecimal.valueOf(0.1);
        BigDecimal j = BigDecimal.valueOf(0.3);
//        BigDecimal k = i.divide(j); //除不尽
        BigDecimal k = i.divide(j,2, RoundingMode.HALF_UP);  //这里的RoundingMode.HALF_UP是一个枚举类里的常量,代表四舍五入
        System.out.println(k);
    }
 
}

这样运行结果就正常了,(保留两位小数)  但是一般还是用double来解决这种问题


再来示例一下,把BigDecimal对象转换成double类型的数据

public class Test {
    public static void main(String[] args) {
        BigDecimal i = BigDecimal.valueOf(0.1);
        BigDecimal j = BigDecimal.valueOf(0.3);
//        BigDecimal k = i.divide(j); //除不尽
        BigDecimal k = i.divide(j,2, RoundingMode.HALF_UP);  //这里的RoundingMode.HALF_UP是一个枚举类里的常量,代表四舍五入
        //把BigDecimal对象转换成doubLe类型的数据
        double rs = k.doubleValue();
        System.out.println(rs);
    }
}

运行结果: 已转换为double类型


使用规范

提及其中的一点:        (取自Java开发手册)

禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象。


说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。


如:BigDecimal g = new BigDecimal(0.1F);  实际的存储值为:0.10000000149

正例        优先推荐入参为String的构造方法去,或使用BigDecinal的valueOf方法,此方法内部其实执行了Double的toString,而Double的toString按double的实际能表达的精度对尾数进行了截断。


END



目录
打赏
0
1
1
0
74
分享
相关文章
洋码头商品 API 示例指南(Python 实现)
洋码头是国内知名跨境电商平台,提供商品搜索、详情、分类等API接口。本文详解了使用Python调用这些API的流程与代码示例,涵盖签名生成、请求处理及常见问题解决方案,适用于构建选品工具、价格监控等跨境电商应用。
速卖通商品 API,开发者示例
速卖通商品API是速卖通开放平台为开发者提供的接口,支持获取商品详情、订单管理等功能。具备多语言、多货币支持,适用于全球电商场景。可应用于商品分析、价格监控、竞品对比和库存管理等业务。文档提供Python调用示例,便于快速集成使用。
|
22天前
|
VIN车辆识别码查询车五项 API 实践指南:让每一俩车有迹可循(Python代码示例)
VIN(车辆识别代码)是全球唯一的17位汽车标识码,可快速获取车架号、发动机号、品牌型号等核心信息。在二手车交易、保险理赔、维修保养等场景中,准确解析VIN有助于提升效率与风控能力。本文介绍VIN码结构、适用场景,并提供Python调用示例及优化建议,助力企业实现车辆信息自动化核验。
98 1
电商API技术文档编写规范白皮书:方法论与行业实践
本文系统阐述电商API接口文档的编写规范与最佳实践,涵盖结构设计、技术语言、开发者体验、版本控制及质量保障等方面,助力企业提升开发效率,构建开放共赢的电商生态。
淘宝商品评论API接口,json数据示例参考
淘宝开放平台提供了多种API接口来获取商品评论数据,其中taobao.item.reviews.get是一个常用的接口,用于获取指定商品的评论信息。以下是关于该接口的详细介绍和使用方法:
电商API行业标准与规范体系构建:推动电商行业规范化前行
电商API行业标准与规范是推动电商高效发展的核心。通过数据格式标准化、接口设计一致性及严格的安全措施,可提升数据交互效率、保障安全并促进系统兼容性。淘宝、京东、拼多多等平台的实践展示了其重要性。未来,智能化、隐私保护强化和跨平台集成将成为主要趋势,助力电商生态持续繁荣。
淘宝关键词搜索商品列表API接入指南(含Python示例)
淘宝关键词搜索商品列表API是淘宝开放平台的核心接口,支持通过关键词检索商品,适用于比价、选品、市场分析等场景。接口提供丰富的筛选与排序功能,返回结构化数据,含商品ID、标题、价格、销量等信息。开发者可使用Python调用,需注意频率限制与错误处理,建议先在沙箱环境测试。
从0到1构建电商API:如何用规范设计省下百万维护成本?
本文系统解析电商API接口开发全流程,涵盖需求分析、架构设计、安全实践、测试上线及文档维护等关键环节,结合技术规范与实际案例,助力构建高可用、可扩展的电商系统。
1688开放平台深度解析:商品详情API调用规范与性能优化策略
1688商品详情接口(alibaba.product.get)提供标准化数据获取方案,支持50+字段,涵盖商品基础信息、SKU详情、价格库存、图文视频资源。适用于电商比价、供应链管理、竞品分析及跨境信息同步,助力企业提升采购效率与市场响应速度。提供Python调用示例及常见问题解决方案,推荐使用本地缓存、异常重试机制和保险服务优化调用体验。
一号店商品 API 示例指南(Python 实现)
本教程介绍如何使用 Python 调用一号店商品 API,涵盖商品搜索、详情、分类等接口的调用方法。内容包括注册认证、签名生成、代码实现及常见问题解决方案,并提供完整示例代码,帮助开发者快速接入一号店开放平台,构建电商工具与数据分析应用。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问