货币计算为什么使用BigDecimal

本文探讨了浮点数在计算机中表示时存在的精度问题,并通过具体的二进制转换实例来说明为什么某些小数无法被精确表示。同时介绍了在Java中如何使用BigDecimal类型来解决这些问题。

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

参考来源:

【java】为什么要使用BigDecimal类型进行高精度运算     float,double等精度丢失问题     MSDN-为何浮点数可能丢失精度       

例子:

BigDecimal的使用是用来解决浮点运算可能精度丢失的问题,那为什么浮点数可能会丢失精度?

首先考虑浮点数的二进制表示,如 :

小数 0.125

0.125 * 2 = 0.25

0

0.25 * 2 = 0.5

0

0.5 * 2 = 1

1

算法是 *2 直到没有小数为止  ,得到0.125 二进制表示为0 . 0 0 1 

 

小数 0.9

0.9 * 2 = 1.8 

取整数部分 1

0.8(1.8的小数部分) * 2 = 1.6   

1

0.6 * 2 = 1.2  

1

0.2 * 2 = 0.4  

0

0.4 * 2 = 0.8  

0

0.8 * 2=1.6

1

0.6 * 2 =1.2  

0

…..

….

从上至下:1 1 1 0 0 1 0 ......

计算过程无限循环,乘以2永远不可能消灭小数部分,这就证明,小数的二进制有时并不能精确表示

这就如同十进制不能表示1/3一样;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值