BigDecimal一定不会丢失精度吗?

尽管BigDecimal通常被认为能避免浮点数运算的精度问题,但其实直接用double构造BigDecimal对象时仍可能丢失精度。正确使用BigDecimal需通过String构造器,避免double的精度损失。此外,应使用BigDecimal的方法进行数学运算,而非算术运算符。为方便操作,可以使用工具类进行double到BigDecimal的转换并进行加减乘除运算。
摘要由CSDN通过智能技术生成

BigDecimal一定不会丢失精度吗?

我们基本已经形成了常识,需要用到金钱的地方要用BigDecimal而不是其他,而我们也都知道浮点型变量在进行计算的时候会出现丢失精度的问题。

那么,你知道其实BigDecimal也会丢失精度吗?而使用BigDecimal的背后又有什么值得去探究的地方吗?今天,告诉你,知其然,也知其所以然。

如下一段代码:
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

可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。

很有可能造成我们手中有0.06元,却无法购买一个0.05元和一个0.01元的商品。

因为如上所示,他们两个的总和为0.060000000000000005。

这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。可能会导致无法下单,或者对账出现问题。所以接下来我们就可以使用Java中的BigDecimal类来解决这类问题。

普及一下:

Java中float的精度为6-7位有效数字。double的精度为15-16位。

API

构造器:
构造器 描述
BigDecima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值