用户输入的浮点数的平等性

时间:2016-04-20 22:17:17

标签: algorithm floating-point equality

这个问题的标题可能不准确。目前我正在使用somethig similar来检查两个浮点值是否为"等于"

public boolean equality(float a, float b) {
    return a == b || (Math.abs(a - b) < EPSILON);
}

当我需要检查 10/3 之类的结果时,如果用户输入类似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)

将它们四舍五入到相同的位数,然后比较舍入值。