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请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
淘宝商品详情API接口概述与JSON数据示例
淘宝商品详情API是淘宝开放平台提供的核心接口之一,为开发者提供了获取商品深度信息的能力。以下是技术细节和示例:
如何在自己的网站接入API接口获取数据?分步指南与实战示例
将第三方API(如微店API)接入网站是扩展功能和获取实时数据的关键。流程包括注册开发者账号、申请API权限、设置认证机制(OAuth 2.0或AppKey签名)、调用API实现前后端协作、处理数据与错误、优化安全性能,并解决常见问题。确保遵循最佳实践,保障系统稳定与安全。通过这些步骤,开发者可高效整合数据,提升应用功能。
淘宝拍立淘按图搜索商品API接口示例说明
淘宝拍立淘按图搜索商品API接口是淘宝开放平台提供的一项基于图像识别技术的搜索服务,允许用户通过上传图片来快速找到相似的商品。以下是对该API接口的示例说明:
淘宝商品评论数据API接口详解及JSON示例返回
淘宝商品评论数据API接口是淘宝开放平台提供的一项服务,旨在帮助开发者通过编程方式获取淘宝商品的评论数据。这些数据包括评论内容、评论时间、评论者信息、评分等,对于电商分析、用户行为研究、竞品分析等领域都具有极高的价值。
亚马逊商品详情API接口的使用方法和示例返回
亚马逊商品详情API接口是亚马逊为开发者提供的一个重要工具,它允许开发者通过编程方式获取亚马逊平台上的商品详细信息。以下是该接口的使用方法和示例返回的简要说明
1688商品详情数据示例参考,1688API接口系列
在成长的路上,我们都是同行者。这篇关于详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
3月前
|
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
78 12
API 规范和设计
今天主要和大家分享的是如何给予 Open API 3.0 标准来设计一套 API 规范。那么整体我们在讲的过程中,大约有以下五方面。 1. 大环境介绍 2. API与服务开放 3. API定义 4. 模型 5. 总结
261 5
API对于程序员的多元用法:从基础到实战
API(应用程序编程接口)是现代软件开发中不可或缺的工具,充当不同系统间沟通的桥梁。通过API,程序员可以轻松获取外部数据、扩展应用功能、实现微服务间的通信等,极大提升开发效率和应用功能性。常见的API类型包括Web API、本地API和第三方API。使用API,开发者能快速集成复杂功能(如支付、物流跟踪),并确保数据安全与管理。掌握API的开发、维护及安全管理技巧,对构建高效、稳定的应用至关重要。随着数字化进程加速,API的重要性将不断提升。
68 1
AI助理

你好,我是AI助理

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