这个问题的标题可能不准确。目前我正在使用somethig similar来检查两个浮点值是否为"等于"
public boolean equality(float a, float b) {
return a == b || (Math.abs(a - b) < EPSILON);
}
当我需要检查 10/3 之类的结果时,如果用户输入类似3.3的内容,则问题就出现了,这是一个有效的答案。如何调整这种情况的功能
答案 0 :(得分:1)
您可以为每个相等性检查添加容差并删除直接相等,因为它取决于其他检查并且不可靠。
public boolean equality(float a, float b, int numberOfImportantDigits) {
float tolerance=1.0/pow(10.0,numberOfImportantDigits-1);
return Math.abs(a - b) < tolerance;
}
然后
equality(10.0f/3.0f, 3.3f, 2)
应该给出0.03333&lt; 0.1这是真的。
equality(1.0f, 1.0000001f, 2)
也应该给0.0000002&lt; 0.1如此真实。
equality(2.0f, 2.09f, 2)
也是真的。
equality(2.00f, 2.10f, 2)
可能会或可能不会取决于机器中2.1是否为2.099999999。
答案 1 :(得分:1)
输入的logartithm为您提供输入中的位数(十进制的基数为10)。使用指数相应地调整你的epsilon。
修改:代码示例:
static final float EPSILON = 0.01f;
public static boolean equality(float a, float b) {
if (a == b) {
return true;
}
double digits = Math.log10(Math.max(Math.abs(a), Math.abs(b)));
double scaledEpsilon = EPSILON * Math.pow(10, digits));
return Math.abs(a - b) < scaledEpsilon;
}
对于(10 / 3,3.3)和(100 / 3,33),返回true,但对于(10 / 3,3)和(100 / 3,30),返回false。
答案 2 :(得分:1)
将它们四舍五入到相同的位数,然后比较舍入值。