zoukankan      html  css  js  c++  java
  • BigDecimal

    1.BigDecimal 的用处

    《阿里巴巴Java开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。 

    具体原理和浮点数的编码方式有关,这里就不多提了,我们下面直接上实例:

    float a = 1.0f - 0.9f;
    float b = 0.9f - 0.8f;
    System.out.println(a);// 0.100000024
    System.out.println(b);// 0.099999964
    System.out.println(a == b);// false

    我们很清楚的知道输出并不是我们想要的结果(精度丢失),我们如何解决这个问题呢?

    一种很常用的方法是:使用使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。

    BigDecimal a = new BigDecimal("1.0");
    BigDecimal b = new BigDecimal("0.9");
    BigDecimal c = new BigDecimal("0.8");
    
    BigDecimal x = a.subtract(b); 
    BigDecimal y = b.subtract(c); 
    
    System.out.println(x); /* 0.1 */
    System.out.println(y); /* 0.1 */
    System.out.println(Objects.equals(x, y)); /* true */

    2.BigDecimal 的大小比较

    a.compareTo(b) : 返回 -1 表示 a 小于 b,0 表示 a 等于 b , 1表示 a 大于 b

    BigDecimal a = new BigDecimal("1.0");
    BigDecimal b = new BigDecimal("0.9");
    System.out.println(a.compareTo(b));// 1

    3.BigDecimal 保留几位小数

    通过 setScale方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA会提示。

    BigDecimal m = new BigDecimal("1.255433");
    BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN);
    System.out.println(n);// 1.255

     4.BigDecimal 的使用注意事项

    注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的 BigDecimal(String) 构造方法来创建对象。

    《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。

    5.总结

    BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。

    BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念

  • 相关阅读:
    美赛 LaTeX 急救指南
    切比雪夫定理的证明
    【持续更新】一个简洁、易用的美赛 LaTeX 模板: easymcm
    一个形式较精细的 Strling 公式的证明
    数学分析的主线,高等数学的一切:连续函数与“有理”分析
    一个自己稍作修改了的美赛论文 LaTeX 模板
    有关几个特殊命题的证明
    实数系与实数定理(下)
    实数系与实数定理(上)
    Office365完整离线安装包下载及自定义安装教程
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/14511000.html
Copyright © 2011-2022 走看看