比较给定数字的小数VB.NET

比较给定数字的小数VB.NET,vb.net,Vb.net,我想看看两个给定的数字,例如1.134和1.135是否有相同的小数。到目前为止,一切都正常工作,但当使用带有大量小数的数字时,我遇到了一个问题: 对于以下输入0.841666667、0.841468253968254,我得到以下错误: Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow. 这是我的密码 Function TrueOrFalse(ByVal

我想看看两个给定的数字,例如1.134和1.135是否有相同的小数。到目前为止,一切都正常工作,但当使用带有大量小数的数字时,我遇到了一个问题: 对于以下输入0.841666667、0.841468253968254,我得到以下错误:

    Unhandled Exception:
System.OverflowException: Arithmetic operation resulted in an overflow.
这是我的密码

Function TrueOrFalse(ByVal x As Double, ByVal y As Double, ByVal n as Integer) As Boolean
   
    For i As Integer = 1 To n+1
        
        If  CInt(x) <> CInt(y) Then
            Return False
        End If
        x *= 10
        y *= 10
    Next
    Return True
End Function
函数TrueOrFalse(ByVal x为Double,ByVal y为Double,ByVal n为整数)为布尔值
对于i,整数=1到n+1
如果CInt(x)CInt(y),则
返回错误
如果结束
x*=10
y*=10
下一个
返回真值
端函数
我理解这是因为Int类型不能包含那么多的数字,当将CInt更改为CLng时,一切都可以完美地工作。问题:我不能使用CLng。还有其他选择吗? 谢谢

在比较整数部分是否相等后,您可以“截断”整数部分,因为您已经知道该部分相等,即,而不是

CInt(1.134) = CInt(1.135)
CInt(11.34) = CInt(11.35)
CInt(113.4) = CInt(113.5)
etc.
你只是比较一下

CInt(1.134) = CInt(1.135)
CInt(1.34) = CInt(1.35)
CInt(3.4) = CInt(3.5)
这样,您的值就不会太大


怎么做?在将
x
y
乘以10之前,删除整数部分,或者直接使用

x = x - CInt(x)
y = y - CInt(y)
或滥用:


一些旁注:

  • TrueOrFalse
    对于您的方法来说不是一个好名字,因为它没有描述该方法的功能
    Areequaluptonecimalplaces
    将是一个更好的名称
  • 使用
    Double
    数据类型时要小心
  • 如果这不是出于教育目的的玩具问题,请注意,对于您的具体问题,有更简单的解决方案(我添加了一个示例作为示例)

如果超出整数范围,请不要使用整数。您可以使用截短双精度

使用该内置功能,您的方法可以简化为以下一行:

Function AreEqualUpToNDecimalPlaces(ByVal x As Double, ByVal y As Double, ByVal n as Integer) As Boolean
    Return Math.Truncate(x * (10.0^n)) = Math.Truncate(y * (10.0^n))
End Function
测试用例:

Console.WriteLine(AreEqualUpToNDecimalPlaces(1.134, 1.135, 2))  ' True
Console.WriteLine(AreEqualUpToNDecimalPlaces(1.134, 1.135, 3))  ' False

Console.WriteLine(AreEqualUpToNDecimalPlaces(0.841666666666667, 0.841468253968254, 3))  ' True
Console.WriteLine(AreEqualUpToNDecimalPlaces(0.841666666666667, 0.841468253968254, 4))  ' False

为什么你不能使用CLng?这是说明,我知道这很奇怪,你可以在比较了
的相等性后“切断”左侧的部分,因为你已经知道这部分是相等的(即
x=x mod 1
,对于
y
),完成。很高兴听到这有帮助。享受编码的乐趣!我还添加了一个更简单的解决方案来解决您的潜在问题,作为一个单独的答案,以防您感兴趣。
Console.WriteLine(AreEqualUpToNDecimalPlaces(1.134, 1.135, 2))  ' True
Console.WriteLine(AreEqualUpToNDecimalPlaces(1.134, 1.135, 3))  ' False

Console.WriteLine(AreEqualUpToNDecimalPlaces(0.841666666666667, 0.841468253968254, 3))  ' True
Console.WriteLine(AreEqualUpToNDecimalPlaces(0.841666666666667, 0.841468253968254, 4))  ' False