java浮点数为什么不精确_java浮点数运算无法精确的问题

Java中的浮点数(float, double)由于二进制表示的局限性,无法进行精确运算,适合科学计算而非商业计算。商业计算推荐使用`java.math.BigDecimal`类,它的构造方法、加减乘除运算提供了精确计算的能力。特别是,避免使用`double`构造方法,因其结果不可预知,建议使用`String`构造方法或`BigDecimal.valueOf()`。" 112640518,10558701,使用 Nexus 创建全能离线仓库,"['仓库管理', 'Nexus', '离线部署', '软件分发', 'Yum源']
摘要由CSDN通过智能技术生成

1.引言

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

先看下面代码

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static void main(String[] args)

{

System.out.println(0.2 + 0.1);

System.out.println(0.3 - 0.1);

System.out.println(0.2 * 0.1);

System.out.println(0.3 / 0.1);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

运行结果如下

738ac1ca390afd68197ea2e5481ee6d2.png

你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。

其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

2.BigDecimal构造方法

1.public BigDecimal(double val)    将double表示形式转换为BigDecimal *不建议使用

2.public BigDecimal(int val)  将int表示形式转换成BigDecimal

3.public BigDecimal(String val)  将String表示形式转换成BigDecimal

为什么不建议采用第一种构造方法呢?来看例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值