为什么float和double运算会丢失精度?BigDecimal就一定靠谱?

浮点数如float和double在运算时由于表示方式限制会丢失精度。BigDecimal虽然能提供更高精度,但直接用`BigDecimal(double)`也会丢失精度,推荐使用`BigDecimal(String)`或`valueOf`来初始化。理解这些原理对避免精度错误至关重要。
摘要由CSDN通过智能技术生成
  • 第三部分用来存储小数(fraction),这里的小数部分是001110011

比如float类型是32位,是单精度浮点表示法:

  • 符号位(sign)占用1位,用来表示正负数,

  • 指数位(exponent)占用8位,用来表示指数,

  • 小数位(fraction)占用23位,用来表示小数,不足位数补0。

而double类型是64位,是双精度浮点表示法:

  • 符号位占用1位,指数位占用11位,小数位占用52位。

  • 指数位决定了大小范围,因为指数位能表示的数越大则能表示的数越大。

  • 而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大。

注意:

  • 程序中应尽量避免浮点数的比较

  • float、double类型的运算往往都不准确

接下来我们讨论一下BigDecimal

===================

1.BigDecimal(double) 创建一个具有参数所指定双精度值的对象

但是这种类型是都不推荐使用的,为什么不推荐使用,我们来试一下

BigDecimal bigDecimal = new BigDecimal(0.2);

System.out.println(bigDecimal);

当你写出这段代码的时候,感觉没啥问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值