一、浮点数比较概述

由于计算机内部浮点数精度的原因,使得本来应该相等的两个浮点数可能存在微小的误差,所以对于浮点数之间浮点数之间的等值判断,我们不能用==来进行比较。通常情况下,对于浮点数比较,我们通常指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。

二、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");
		}
    }
}

参考链接:https://www.cnblogs.com/zhloong/p/java-float-number-compare.html