BigDecimal的基本用法

399 篇文章 12 订阅

在Java中,float声明的变量是单精度浮点数,double声明的变量是双精度浮点数,顾名思义就是double型的实体占用内存空间是float的两倍。float是4个字节而double是8个字节。float和double类型的数据,无法精确表示计算结果,这是由于float和double是不精确的计算。大家可以通过下面代码可以看出来:

public class Test {
    public static void main(String[] args) {

        System.out.println(0.05 + 0.01);
        System.out.println(1.0 - 0.42);
        System.out.println(4.015 * 100);
        System.out.println(123.3 / 100);
    }
}

运行的结果为:

0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999

要想获得理想的结果,我们可以考虑使用BigDecimal来获得更精确的计算:
BigDecimal提供了多个构造函数,和浮点数有关的有:

BigDecimal(double val)  Translates a double into a BigDecimal.
BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal.

但是用double参数来创建对象得到不精确的值,只有通过String来创建对象才是最准确的。
例如:

BigDecimal data1=new BigDecimal(0.05);
System.out.println(data1.toString());
BigDecimal data2=new BigDecimal("0.05");
System.out.println(data2.toString());

得到结果:

0.05000000000000000277555756156289135105907917022705078125
0.05

所以,我们最终需要使用String来创建对象,这样得到的结果才是最精确的。另外,如果是double数,我们还可以使用:BigDecimal.valueOf(double val),原因很简单,其JDK源码如下所示:

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

最后需要说明的是:

BigDecimal的加减乘除其实最终都返回的是一个新的BigDecimal对象因为BigDecimal是不可变的(immutable)的在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b)。

BigDecimal是Java中用于处理高精度数字的类。相较于double或float类型,BigDecimal类型可以精确表示较大或较小的数字,且不会出现精度丢失的问题。 下面是BigDecimal基本使用方法: 1. 创建BigDecimal对象 可以通过传入字符串或double类型的值来创建BigDecimal对象。如下所示: ``` BigDecimal bg1 = new BigDecimal("123.456"); BigDecimal bg2 = new BigDecimal(123.456); ``` 2. 进行基本的运算 可以使用BigDecimal提供的方法进行加、减、乘、除等基本运算操作。注意,需要使用对应的方法,如add()进行加法运算,subtract()进行减法运算,multiply()进行乘法运算,divide()进行除法运算。如下所示: ``` BigDecimal bg1 = new BigDecimal("123.456"); BigDecimal bg2 = new BigDecimal("789.012"); BigDecimal result = bg1.add(bg2); // 加法运算 result = bg1.subtract(bg2); // 减法运算 result = bg1.multiply(bg2); // 乘法运算 result = bg1.divide(bg2); // 除法运算 ``` 3. 设置精度和取舍规则 可以使用setScale()方法来设置BigDecimal对象的精度,并使用setRoundingMode()方法来设置取舍规则。如下所示: ``` BigDecimal bg = new BigDecimal("123.456789"); bg.setScale(2, RoundingMode.HALF_UP); // 设置精度为2位,取舍规则为四舍五入 ``` 4. 比较大小 可以使用compareTo()方法来比较两个BigDecimal对象的大小。如果返回值为0,则表示两者相等;如果返回值为正数,则表示当前对象大于另一个对象;如果返回值为负数,则表示当前对象小于另一个对象。如下所示: ``` BigDecimal bg1 = new BigDecimal("123.456"); BigDecimal bg2 = new BigDecimal("789.012"); int compareResult = bg1.compareTo(bg2); // 比较大小 ``` 以上就是BigDecimal基本使用方法。需要注意的是,在进行运算时,尽量使用BigDecimal提供的方法,以避免精度丢失问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值