前言
提示:浮点之间的的呢韩国值判断,基本数据类型之间不能用 == 进行比较,包装数据类型不能用鹅equals方法判断
说明:浮点数采用的是“尾数+阶码”,的编码方式,类似科学技术法的“有效数字+指数”,的表示方式,二进制无法精确的表示大不凡的十进制小数。
一、反例!!!!
代码反例如下(示例):
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
if(a == b){
// 预期进入此代码块,执行其他业务逻辑
// 但是a == b 的结果是false
}
Float x = Float.valueof(a);
Float y = Float.valueof.(b);
if(x.equals(y)){
//预期进入此代码快,执行业务
//但是x.equals(y)的结果是False
}
二、正例
代码如下(示例):
<font color=#999AAA >代码如下(示例):
```java
// 方式一 应该指定一个范围的误差,两个浮点数的差值再此范围之内,则认为是相等的
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
//10的-6次方表示
float diff=1e-6f;
if(MAth.abs(a - b) < diff){
System.out.println("true");
}
//方式二 使用BigDecimal来定义值,在进行浮点数的操作运算;
Bigdecimal a = new BigDecimal("1.0");
Bigdecimal a = new BigDecimal("0.9");
Bigdecimal a = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
Bigdecimal y = b.subtract(c);
if(x.euqals(y)){
System.out.println("true")
}
注意!!!
禁止使用Bigdecimal( double (数据类型) ) 进行double
值转换成Bigdecimal(对象),因为会存在精度丢失,
应该先把double toString为字符串类型,通过呢new Bigdecimal(“double数值”)
例子:new Bigdecimal(“0.1”)
或者通过 Bigdecimal.valueof( 0.1);