该问题的标题可能不准确。我目前使用somethig similar检查两个浮点值是“等于”用户输入的浮点数相等
public boolean equality(float a, float b) {
return a == b || (Math.abs(a - b) < EPSILON);
}
问题出现时,我需要检查的类似10/3结果,如果用户输入类似3.3它是有效的回答。如何根据这种情况调整功能
该问题的标题可能不准确。我目前使用somethig similar检查两个浮点值是“等于”用户输入的浮点数相等
public boolean equality(float a, float b) {
return a == b || (Math.abs(a - b) < EPSILON);
}
问题出现时,我需要检查的类似10/3结果,如果用户输入类似3.3它是有效的回答。如何根据这种情况调整功能
您可以为每个相等检查添加一个容差,并删除直接相等性,因为它依赖于其他检查并且不可靠。
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 < 0.1这是真实的。
equality(1.0f, 1.0000001f, 2)
也应该给0.0000002 < 0.1如此正确。
equality(2.0f, 2.09f, 2)
也是正确的。
equality(2.00f, 2.10f, 2)
可能会或可能不会取决于2.1是否为2.099999999在机器中。
输入的对数为您提供输入中的位数(十进制的基数为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;
}
返回true为(10/3,3.3)和(100/3,33),但对虚假(10/3,3)和(100/3,30)。
你能否请加一些这样的例子 – rkmax
@rkmax新增... –
将它们都舍入到相同的位数,然后比较舍入的值。
目前,'a == b'测试是多余的。 – displayName
@displayName考虑无穷大 – harold