zoukankan      html  css  js  c++  java
  • 金融项目java开发_BigDecimal(解决计算精度问题)

    当使用double进行商业运算时,double计算会丢失精度。可以使用BigDecimal进行计算。

    1. import java.math.BigDecimal;  
    2. import org.junit.Test;  
    3. public class TestBigDecimal{  
    4.   @Test  
    5.   public void test(){  
    6.       double a=0.1;  
    7.       double b=0.2;  
    8.       System.out.println(a+b);  
    9.   
    10.       BigDecimal a1=new BigDecimal("0.1");  
    11.   
    12.       BigDecimal b1=new BigDecimal("0.2");  
    13.   
    14.       System.out.println(a1+b1);  
    15.       BigDecimal c1=new BigDecimal("0.23574");  
    16.       a1=a1.add(c1);  
    17.       a1=a1.setScale(1,BigDecimal.ROUND_DOWN);  
    18.       System.out.println(a1);  
    19.   }  
    20. }  


    输出结果如下:

    0.30000000000000004

    0.3
    0.3

    double的加减无法精确计算出0.3,而使用BigDecimal却可以。

    当然,如果直接将double传给BigDecimal,你会发现不但无法解决精度问题,反而对精度进行了补全。所以,为确保精度,我们将String传给它。


    BigDecimal.setScale()方法用于格式化小数点
    setScale(1)表示保留一位小数,默认用四舍五入方式
    setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
    setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
    setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
    setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍


    .scale()  取精度值,即小数点后位数(注:BigDecimal可以通过setScale来提高精度,只要新设的值比原来的大!
    BigDecimal也可以通过setScale来降低精度。因为新设的值比原来的小,所以必须保证原来数值的该位小数点后面都是0,只有这样才可以设比原来小的精度。

    例:原来的值是:4.1235648,想把scale设为小于7为都会出错的,如果原来的值是:4.1235000,把scale设为小于4位会出错,而设为4、5、6、7都没有问题,设得更大,肯定不会出错)

    add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。
    subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
    multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。
    divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。

    BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

    例:BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);

    ----结果:----- mData=9.66

    toString()                将BigDecimal对象的数值转换成字符串。
    doubleValue()          将BigDecimal对象中的值以双精度数返回。
    floatValue()             将BigDecimal对象中的值以单精度数返回。
    longValue()             将BigDecimal对象中的值以长整数返回。
    intValue()               将BigDecimal对象中的值以整数返回。


  • 相关阅读:
    centos安装配置jdk
    java封装数据类型——Byte
    centos7安装mysql8
    centos安装redis
    centos源码安装nginx
    Linux查看系统及版本信息
    sqlyog无操作一段时间后重新操作会卡死问题
    mysql8中查询语句表别名不能使用 “of”
    一次腾讯云centos服务器被入侵的处理
    java封装数据类型——Long
  • 原文地址:https://www.cnblogs.com/jpfss/p/8072776.html
Copyright © 2011-2022 走看看