1.使用理由:

  • Double类和Float类可以对16位有效数字的数进行精确运算,但对于超过16位有效数字的数,会丢失精度。所以使用BigDecimal类来精确计算超过16位有效数字的数。

2.引入包:

  • import java.math.BigDecimal;

3.构造方法:

  • BigDecimal(E):创建一个具有参数所指定类型的对象
  • 使用样例:
    Scanner sc=new Scanner(System.in);
    BigDecimal b= new BigDecimal(0.1);
    BigDecimal c= new BigDecimal("0.1");
    BigDecimal a=sc.nextBigDecimal();
    System.out.println("输入值位:"+a);
    System.out.println("用浮点型创建:"+b);
    System.out.println("字符串类型创建:"+c);
  • 结果分析:输入值创建具有可预知性,但双精度浮点型创建具有一定的不可预知性。用String创建的值是准确的。
    输入值位:0.1
    用浮点型创建:0.1000000000000000055511151231257827021181583404541015625
    字符串类型创建:0.1

4.常用方法:

  • 加法:add(BigDecimal)

  • 减法:subtract(BigDecimal) 返回值:BigDecimal

  • 乘法:multiply(BigDecimal) 返回值:BigDecimal

  • 除法:divide(BigDecimal) 返回值:BigDecimal

  • 转换:toString(),intValue(),floatValue()

  • 比较:campareTo(BigDecimal) 返回值:1 表示 >,0 表示 =,-1 表示 <

5.易错提示:

  • 除法的异常提醒:Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

  • 示例代码:

    public static void main(String []args){
    Scanner sc=new Scanner(System.in);
    BigDecimal b= new BigDecimal(1);
    BigDecimal c= new BigDecimal("0.1");
    BigDecimal a= new BigDecimal(3);
    System.out.println(b.divide(a));
    }
  • 解决方法:设置精确小数位。

    BigDecimal java.math.BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
    BigDecimal:表示被除数
    divisor:表示除数
    scale:表示精确位数
    roundingMode:表示舍入模式
    java提供的模式:
      四舍五入:Bigdecimal.ROUND_HALF_UP
      五舍六入:Bigdecimal.ROUND_HALF_DOWN
      向上取整:Bigdecimal.ROUND_CEILING
      向下取整:Bigdecimal.ROUND_FLOOR
      等.....
  • 示例代码:

    public static void main(String []args){

            Scanner sc=new Scanner(System.in);
            BigDecimal b= new BigDecimal(1);
            BigDecimal c= new BigDecimal("0.1");
            BigDecimal a= new BigDecimal(3);
            System.out.println(b.divide(a,2,BigDecimal.ROUND_CEILING));
        }

Java BigDecimal 分析的更多相关文章

  1. java bigDecimal and double

    Java BigDecimal和double   BigDecimal是Java中用来表示任意精确浮点数运算的类,在BigDecimal中,使用unscaledValue × 10-scale来表示一 ...

  2. Java 性能分析工具 , 第 3 部分: Java Mission Control

    引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...

  3. Java 性能分析工具 , 第 2 部分:Java 内置监控工具

    引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...

  4. 浅谈java性能分析

    浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...

  5. TDA - Thread Dump Analyzer (Java线程分析工具)

    TDA - Thread Dump Analyzer (Java线程分析工具)http://automationqa.com/forum.php?mod=viewthread&tid=2351 ...

  6. JAVA 可视化分析工具 第12节

    JAVA 可视化分析工具  第12节 经过前几章对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!那么这章我们就根据已有的理论知识,通过可视化工具来实践一番. 我们今天要讲 ...

  7. Java 反射 分析类和对象

    Java 反射 分析类和对象 @author ixenos 摘要:优化程序启动策略.在运行时使用反射分析类的结构和对象 优化程序启动策略 在启动时,包含main方法的类被加载.它会加载所有它需要的类. ...

  8. 深入理解JVM(八)——java堆分析

    上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...

  9. Java集合分析

    Java集合分析 前言 从开始接触Java的时候, 就在强调的一个重要版块, 集合. 终于能够开始对它的源码进行分析, 理解, 如果不懂得背后的思想, 那么读懂代码, 也仅仅是读懂了 if else ...

  10. JVM学习--(八)java堆分析

    上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...

随机推荐

  1. mac 如何快捷键打开当前文件夹对应的终端窗口

  2. 2023-03-12:mp3音频解码为pcm,代码用go语言编写,调用moonfdd/ffmpeg-go库。

    2023-03-12:mp3音频解码为pcm,代码用go语言编写,调用moonfdd/ffmpeg-go库. 答案2023-03-12: 用github/moonfdd/ffmpeg-go库. 命令如 ...

  3. 2020-10-06:java中垃圾回收器让工作线程停顿下来是怎么做的?

    福大大答案2020-10-06: 简单回答:安全点,主动式中断. 中级回答:用户线程暂停,GC 线程要开始工作,但是要确保用户线程暂停的这行字节码指令是不会导致引用关系的变化.所以 JVM 会在字节码 ...

  4. 2022-01-26:最优账单平衡。 一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x

    2022-01-26:最优账单平衡. 一群朋友在度假期间会相互借钱.比如说,小爱同学支付了小新同学的午餐共计 10 美元.如果小明同学支付了小爱同学的出租车钱共计 5 美元.我们可以用一个三元组 (x ...

  5. Jenkins - 更改插件镜像源地址

    Jenkins - 更改插件镜像源地址 进入 系统管理 > 插件管理 > 高级 在升级站点输入框,输入清华的Jenkins镜像源地址:点击提交保存即可: jenkins插件清华大学镜像地址 ...

  6. pages.json 文件:自定义导航栏

    自定义导航栏使用注意 当navigationStyle设为custom或titleNView设为false时,原生导航栏不显示,此时要注意几个问题: 非H5端,手机顶部状态栏区域会被页面内容覆盖.这是 ...

  7. vue请求后端数据和跨域问题

    最近遇到的一个问题 后端写好的接口,前端怎么获取数据 这是我后端的接口:GET 接口 这是我前端运行的项目地址: 简单使用: 咱门前端使用 颇受好评的 axios 来发起请求 这是它的官网:https ...

  8. bulkWrite探秘

    MongoDB有很多有趣的内置方法,其中为了批量处理一些写入操作,并且可以按照一定顺序执行,自从3.2版本之后提供了该批量方法:bulkWrite. 它的语法很简单: db.collection.bu ...

  9. CKS 考试题整理 (14)-启用API Server认证

    Context 由 kubeadm 创建的cluster 的kubernetes API 服务器,出于测试目的, 临时配置允许未经身份验证和未经授权的访问,授予匿名用户 cluster-admin 的 ...

  10. SpringBoot 如何优雅的进行全局异常处理?

    在SpringBoot的开发中,为了提高程序运行的鲁棒性,我们经常需要对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量业务不相关的异常处理代码,增加了程序的耦合,同时未 ...