Java BigDecimal 一些注意点

本文详细介绍了BigDecimal在商业计算中的重要性及其工作原理。针对float和double类型的局限性,BigDecimal提供了高精度的算术运算能力,适用于需要精确结果的场景。文章还列举了常用的BigDecimal操作方法,并提醒开发者注意使用细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要有BigDecimal ,他是干什么的

float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候就要使用BigDecimal啦。


什么是BigDecimal

BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。


用法

可以处理任意长度的浮点数运算。

BigDecimal add(BigDecimal val) //BigDecimal 加法

BigDecimal subtract (BigDecimal val) //BigDecimal 减法

BigDecimal multiply (BigDecimal val) //BigDecimal 乘法

BigDecimal divide (BigDecimal val,RoundingMode mode) 除法


注意 *使用时要查看一下源码,有好多实现细节需要注意(有坑啊)

参数类型为double的构造方法的结果有一定的不可预知性

尽量使用参数类型为String的构造函数。

BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常, 需要设置精确度;就是给divide设置精确的小数点 。

参数类型为double的构造方法的结果有一定的不可预知性,因为不能double表示为任何有限长度的二进制小数,遇到这种情况先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用valueOf(double)方法。

使用compareTo方法来进行比较。返回的结果是int类型,-1表示小于,0是等于,1是大于。因为BigDecimal比较时,不仅比较值,而且还比较精度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值