我在使用eval(...)实现开发一些工程规则值引擎时遇到了以下问题.
Dim first As Double = 1.1
Dim second As Double = 2.2
Dim sum As Double = first + second
If (sum = 3.3) Then
Console.WriteLine("Matched")
Else
Console.WriteLine("Not Matched")
End If
Run Code Online (Sandbox Code Playgroud)
'以上条件返回false,因为sum的值是3.3000000000000003而不是3.3
它看起来像是第15位是往返的.有人可能会给出更好的解释.
Math.Round(...)只有解决方案可用吗?还有其他东西我也可以尝试?
你没有添加小数 - 你加起来是双打.
并非所有双打都可以在计算机中准确表示,因此出错.我建议阅读这篇文章的背景(每个计算机科学家应该知道的关于浮点算术的内容).
请改用Decimal类型,它不会遇到这些问题.
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
Run Code Online (Sandbox Code Playgroud)
这就是双数在 PC 中的工作原理。比较它们的最好方法是使用这样的结构
if (Math.Abs(second - first) <= 1E-9)
Console.WriteLine("Matched")
Run Code Online (Sandbox Code Playgroud)
相反,如果1E-9您可以使用另一个数字,这将代表比较中可能出现的错误。