Addition of Double values inconsistent

后端 未结 7 1996
渐次进展
渐次进展 2021-01-20 01:13

I came across following issue while developing some engineering rule value engine using eval(...) implementation.

    Dim first As Double = 1.1
    Dim secon         


        
相关标签:
7条回答
  • 2021-01-20 01:19

    In C#, Java, Python, and many other languages, decimals/floats are not perfect. Because of the way they are represented (using multipliers and exponents), they often have inaccuracies. See http://www.yoda.arachsys.com/csharp/decimal.html for more info.

    0 讨论(0)
  • 2021-01-20 01:25

    that's how the double number work in PC. The best way to compare them is to use such a construction

    if (Math.Abs(second - first) <= 1E-9)
     Console.WriteLine("Matched")
    

    instead if 1E-9 you can use another number, that would represent the possible error in comparison.

    0 讨论(0)
  • 2021-01-20 01:27

    Equality comparisons with floating point operations are always inaccurate because of how fractional values are represented within the machine. You should have some sort of epsilon value by which you're comparing against. Here is an article that describes it much more thoroughly:

    http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating%20point%20numbers.htm

    Edit: Math.Round will not be an ideal choice because of the error generated with it for certain comparisons. You are better off determining an epsilon value that can be used to limit the amount of error in the comparison (basically determining the level of accuracy).

    0 讨论(0)
  • 2021-01-20 01:27

    THis is a well known problem with floating point arithmatic. Look into binary coding for further details.

    Use the type "decimal" if that will fit your needs.

    But in general, you should never compare floating point values to constant floating point values with the equality sign.

    Failing that, compare to the number of places that you want to compare to (e.g. say it is 4 then you would go (if sum > 3.2999 and sum < 3.3001)

    0 讨论(0)
  • 2021-01-20 01:37

    A double uses floating-point arithmetic, which is approximate but more efficient. If you need to compare against exact values, use the decimal data type instead.

    0 讨论(0)
  • 2021-01-20 01:39

    You are not adding decimals - you are adding up doubles.

    Not all doubles can be represented accurately in a computer, hence the error. I suggest reading this article for background (What Every Computer Scientist Should Know About Floating-Point Arithmetic).

    Use the Decimal type instead, it doesn't suffer from these issues.

    Dim first As Decimal = 1.1
    Dim second As Decimal = 2.2
    Dim sum As Decimal= first + second
     If (sum = 3.3) Then
        Console.WriteLine("Matched")
    Else
        Console.WriteLine("Not Matched")
    End If
    
    0 讨论(0)
提交回复
热议问题