• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

java BigDecimal使用(小数点,字符串等转换)

武飞扬头像
globalcoding
帮助4

一、BigDecimal介绍 

Java中提供了操作大数字(超过16位有效位)的类,

java.math.BigInteger 类和 java.math.BigDecimal 类,用于高精度计算。

float和Double只能用来做科学计算、工程计算等;在商业计算中,对数字精度要求较高(例如货币值),必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算。

BigInteger BigDecimal
大整数 大小数

以BigDecimal为例。

BigDecimal类创建的是对象,不能使用传统的 、-、*、/ 等算术运算符进行数学运算,而必须调用它的方法。方法的参数也必须是BigDecimal类型的对象。

二、数字转换类型问题

java中,BigDecimal十分好用。各种格式的数字只要往BigDecimal里无脑丢即可。例如:

  1.  
    //字符串型
  2.  
    String num1 = "10.0";
  3.  
    BigDecimal d1 = new BigDecimal(num1);
  4.  
    int i1 = d1.intValue();

例如,别的系统给你传数据,发过来的都是字符串,其中有个字段是数量。但对方传过来的是"10.0",如果用 Integer.parseInt(num1),就会报错如下。

java.lang.NumberFormatException: For input string: "10.0"

如果要处理这种情况,按照传统的方法,就得加很多校验,判断是否有小数点,等等。但如果用BigDecimal,就很舒服。

三、BigDecimal常见问题

1.new Decimal时不允许传double

new BigDecimal()的时候,不允许传入double类型的数,通常传入String类型的数(推荐这样)。

因为double类型的数传入BigDecimal无法得到精确值。

例如:

  1.  
    BigDecimal b1 = new BigDecimal(0.1); //不允许
  2.  
    BigDecimal b2 = new BigDecimal("0.1"); //推荐

不允许传入double类型的原因: 

  1.  
    BigDecimal b10 = new BigDecimal(0.1);
  2.  
    BigDecimal b11 = new BigDecimal(1.1);
  3.  
    System.out.println(b10.add(b11).doubleValue()); //输出1.2000000000000002
  4.  
     
  5.  
    BigDecimal b12 = new BigDecimal("0.1");
  6.  
    BigDecimal b13 = new BigDecimal("1.1");
  7.  
    System.out.println(b12.add(b13).doubleValue()); //输出1.2

如果值是double类型, 就需要先转换成String,再传入。也可以使用 valueOf(),用法如下

BigDecimal.valueOf(0.1)

它的源码其实就是将double转string:

  1.  
    public static BigDecimal valueOf(double val) {
  2.  
    return new BigDecimal(Double.toString(val));
  3.  
    }

四、工具类

  1.  
    public class Arith {
  2.  
     
  3.  
    public static double add(double value1,double value2){
  4.  
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
  5.  
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  6.  
    return b1.add(b2).doubleValue();
  7.  
    }
  8.  
     
  9.  
     
  10.  
    public static double sub(double value1,double value2){
  11.  
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
  12.  
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  13.  
    return b1.subtract(b2).doubleValue();
  14.  
    }
  15.  
     
  16.  
     
  17.  
    public static double mul(double value1,double value2){
  18.  
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
  19.  
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  20.  
    return b1.multiply(b2).doubleValue();
  21.  
    }
  22.  
     
  23.  
     
  24.  
    public static double div(double value1,double value2,int scale) throws IllegalAccessException{
  25.  
    if(scale<0){
  26.  
    throw new IllegalAccessException("精确度不能小于0");
  27.  
    }
  28.  
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
  29.  
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  30.  
    return b1.divide(b2, scale).doubleValue();
  31.  
    }
  32.  
    }

五、保留小数位 

ROUND_DOWN --> 直接删除多余的小数位 ,(这种方式得到的绝对值不会比原数大)

ROUND_UP --> 在最后一位直接加1,

ROUND_CEILING --> 正数时与ROUND_UP一致,负数时与ROUND_DOWN一致

ROUND_FLOOR --> 正数时与Round_DOWN一致,负数时与ROUND_UP一致

ROUND_HALF_UP --> 四舍五入

ROUND_HALF_DOWN --> 五舍六入

ROUND_HALE_EVEN --> 四舍六入五看奇进偶不进(四舍六入五成双)

参考

Java中BigDecimal类型数据保留小数的精度设置

java精确除法运算(BigDecimal)

其他参考

如何理解double精度丢失问题? - 知乎  

=======================分割线========================== 

文章到这里已经结束,以下是紫薯布丁

        //字符串型
        String num1 = "10.0";
        BigDecimal d1 = new BigDecimal(num1);
        int i1 = d1.intValue();

        BigDecimal b10 = new BigDecimal(0.1);
        BigDecimal b11 = new BigDecimal(1.1);
        System.out.println(b10.add(b11).doubleValue());    //输出1.2000000000000002

        BigDecimal b12 = new BigDecimal("0.1");
        BigDecimal b13 = new BigDecimal("1.1");
        System.out.println(b12.add(b13).doubleValue());    //输出1.2

    public static BigDecimal valueOf(double val) {
        return new BigDecimal(Double.toString(val));
    }

public class Arith {

    public static double add(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.add(b2).doubleValue();
    }
    

    public static double sub(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.subtract(b2).doubleValue();
    }
    

    public static double mul(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.multiply(b2).doubleValue();
    }
    

    public static double div(double value1,double value2,int scale) throws IllegalAccessException{
        if(scale<0){         
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.divide(b2, scale).doubleValue();    
    }
}

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfccffe
系列文章
更多 icon
同类精品
更多 icon
继续加载