JAVA之浮点数的比较
一、浮点数比较概述
由于计算机内部浮点数精度的原因,使得本来应该相等的两个浮点数可能存在微小的误差,所以对于浮点数之间浮点数之间的等值判断,我们不能用==来进行比较。通常情况下,对于浮点数比较,我们通常指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。
二、JS浮点数的比较
var diff = 1e-5; // 定义精度精确到0.00001
var a = 0.1;
var b = 0.2;
var sum = 0.3;
// 判断相差小于精度就认为相等
if(Math.abs(a + b - sum) <= diff) {
console.log('a + b == sum');
}
//或者使用JavaScript提供的最小精度值
if(Math.abs(a + b - sum)<= Number.EPSILON){
console.log('a + b == sum');
}
三、JAVA浮点数的比较
3.1比较绝对值误差
final float THRESHOLD = 0.000001; // 设置最大误差不超过0.000001
float f1 = 0.0f;
//对f1执行11次加0.1操作
for (int i = 0; i < 11; i++) {
f1 += 0.1f;
}
float f2 = 0.1f * 11;
if (Math.abs(f1 - f2) < THRESHOLD) {
System.out.println("f1 equals f2");
}
3.2BigDecimal
通过使用java.math包中提供的API类BigDecimal,使用它的compareTo()方法比较即可。
import java.math.BigDecimal;
public class Test
{
public static void main(String[] args)
{
BigDecimal f1 = new BigDecimal("0.0");
BigDecimal pointOne = new BigDecimal("0.1");
for (int i = 0; i < 11; i++) {
f1 = f1.add(pointOne);
}
BigDecimal f2 = new BigDecimal("0.1");
BigDecimal eleven = new BigDecimal("11");
f2 = f2.multiply(eleven);
System.out.println("f1 = " + f1);
System.out.println("f2 = " + f2);
if (f1.compareTo(f2) == 0) {
System.out.println("f1 and f2 are equal using BigDecimal");
} else {
System.out.println("f1 and f2 are not equal using BigDecimal");
}
}
}
若详细了解BigDecimal,点击JAVA之BigDecimal详解
参考链接:https://www.cnblogs.com/zhloong/p/java-float-number-compare.html