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