2016-04-20 52 views
1

该问题的标题可能不准确。我目前使用somethig similar检查两个浮点值是“等于”用户输入的浮点数相等

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

问题出现时,我需要检查的类似10/3结果,如果用户输入类似3.3它是有效的回答。如何根据这种情况调整功能

+0

目前,'a == b'测试是多余的。 – displayName

+2

@displayName考虑无穷大 – harold

回答

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 < 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在机器中。

+0

是的,但是如何计算容忍的价值,现在我正在使用它(它被称为epsilon) – rkmax

+0

然后你需要指定哪个数字对你很重要。 –

+0

我想要最多2位数 – rkmax

1

输入的对数为您提供输入中的位数(十进制的基数为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)。

+0

你能否请加一些这样的例子 – rkmax

+0

@rkmax新增... –

1

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