java bigdecimal 初始化_Java关于BigDecimal的介绍及用法(一)

一、BigDecimal概述

​  Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。

一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

​  BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

二、BigDecimal常用构造函数

2.1、常用构造函数

BigDecimal(int)

创建一个具有参数所指定整数值的对象

BigDecimal(double)

创建一个具有参数所指定双精度值的对象

BigDecimal(long)

创建一个具有参数所指定长整数值的对象

BigDecimal(String)

创建一个具有参数所指定以字符串表示的数值的对象

2.2、通过具体代码操作进行分析

BigDecimal有多种构造函数,常用的有2种。建议使用String构造方式,不建议使用double构造方式。

//强制使用String的构造函数,double也有可能计算不太准确//原则是使用BigDecimal并且一定要用String来构造。

publicBigDecimal(String val);public BigDecimal(double val);

使用示例:

@Test

public void test6(){

BigDecimal a = new BigDecimal(0.1);

System.out.println("a = " + a);

System.out.println("=====================");

BigDecimal b = new BigDecimal("0.1");

System.out.println("b = " + b);

}

结果示例:

aca053d7baf63cb2462e839889115cae.png

原因分析:

1)参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

2)String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言, 通常建议优先使用String构造方法。

3)当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。

三、BigDecimal常用方法详解

3.1、常用方法

add(BigDecimal)

BigDecimal对象中的值相加,返回BigDecimal对象

subtract(BigDecimal)

BigDecimal对象中的值相减,返回BigDecimal对象

multiply(BigDecimal)

BigDecimal对象中的值相乘,返回BigDecimal对象

divide(BigDecimal)

BigDecimal对象中的值相除,返回BigDecimal对象

abs()

将BigDecimal对象中的值转换成绝对值

doubleValue()

将BigDecimal对象中的值转换成双精度数

floatValue()

将BigDecimal对象中的值转换成单精度数

longValue()

将BigDecimal对象中的值转换成长整数

intValue()

将BigDecimal对象中的值转换成整数

toString()

将BigDecimal对象中的值转换成字符串

@Testpublic voidtest7(){

BigDecimal valueFir= new BigDecimal(0.05);

BigDecimal valueSec= new BigDecimal(100);

BigDecimal valueThi= new BigDecimal(-100);//尽量用字符串的形式初始化

BigDecimal stringFir = new BigDecimal("0.05");

BigDecimal stringSec= new BigDecimal("100");

BigDecimal stringThi= new BigDecimal("-100");//加法

BigDecimal addVal =valueFir.add(valueSec);

System.out.println("加法用value结果:" +addVal);

BigDecimal addStr=stringFir.add(stringSec);

System.out.println("加法用string结果:" +addStr);//减法

BigDecimal subtractVal =valueFir.subtract(valueSec);

System.out.println("减法value结果:" +subtractVal);

BigDecimal subtractStr=stringFir.subtract(stringSec);

System.out.println("减法用string结果:" +subtractStr);//乘法

BigDecimal multiplyVal =valueFir.multiply(valueSec);

System.out.println("乘法用value结果:" +multiplyVal);

BigDecimal multiplyStr=stringFir.multiply(stringSec);

System.out.println("乘法用string结果:" +multiplyStr);//绝对值

BigDecimal absVal =valueThi.abs();

System.out.println("绝对值用value结果:" +absVal);

BigDecimal absStr=stringThi.abs();

System.out.println("绝对值用string结果:" +absStr);//除法

BigDecimal divideVal = valueSec.divide(valueFir, 20, BigDecimal.ROUND_HALF_UP);

System.out.println("除法用value结果:" +divideVal);

BigDecimal divideStr= stringSec.divide(stringFir, 20, BigDecimal.ROUND_HALF_UP);

System.out.println("除法用string结果:" +divideStr);

}

测试结果:(根据结果,初始化建议使用String)

c47430bb440aeb285b69660aa40d5515.png

3.2、BigDecimal大小比较

java中对BigDecimal比较大小一般用的是bigdemical的compareTo方法

@Testpublic voidtest8(){//尽量用字符串的形式初始化

BigDecimal a = new BigDecimal("12");

BigDecimal b= new BigDecimal("34");

System.out.println(a.compareTo(b));

}

返回结果分析:

-1 ---------------- 表示 a < b0 ---------------- 表示 a = b1 ---------------- 表示 a > b

举例:c大于等于d

new bigdemica(c).compareTo(new bigdemical(d)) >= 0

四、更多关于BigDecimal的介绍请阅读下一篇博客

记得点波收藏o!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值