Comparing floating point values

前端 未结 3 1852
别跟我提以往
别跟我提以往 2020-11-27 21:12

I just read a statement about the floating point value comparison

Floating point values shall not be compared using either the == or != operators.

相关标签:
3条回答
  • 2020-11-27 21:40

    "Best method" depends on the circumstances of why you want to compare the numbers. In general, if you think you want to check if 2 floating points numbers are equal, you are doing something wrong.

    Floating point numbers are supposed to be used to represent real values, in both senses of the word. Is this object the same length as this other object? Well, they may look the same length, but if you get a good enough measuring device, you can always find a difference. Similarly, two floating point numbers are never equal, unless they are measuring the same thing, and have been processed in exactly the same way. Other than that, it's just a rounding error somewhere in the system.

    You might want to check that they are close, (closer than a certain threshold) as the other answers have suggested, but not equal.

    0 讨论(0)
  • 2020-11-27 21:46

    The following extension methods may be useful to implement Kevin's suggestion:

    public static bool IsEqualTo(this double a, double b, double margin)
    {
        return Math.Abs(a - b) < margin;
    }
    
    public static bool IsEqualTo(this double a, double b)
    {
        return Math.Abs(a - b) < double.Epsilon;
    }
    

    So now you can just do:

    if(x1.IsEqualTo(x2)) ...
    if(x1.IsEqualTo(x2, 0.01)) ...
    

    Just change the IsEqualTo to a more appropriate name, or change the default margin to anything better than double.Epsilon, if needed.

    0 讨论(0)
  • 2020-11-27 21:47

    Generally floating point numbers should be compared using a construct like

    if( abs((x1 - x2) < 0.001) )
    

    The reason for the warning you quoted is you may have two methods of calculating something, and they may be equal if you had no rounding error, but the rounding error makes them slightly different.

    0 讨论(0)
提交回复
热议问题