CInt(Double)
被編譯爲調用默認Math.Round(Double)
,並將結果轉換爲Integer
隱式轉換,因此主要理由使用Math.Round(Double, MidpointRounding.AwayFromZero)
代替CInt(Double)
將
- 使用
MidpointRounding.AwayFromZero
四捨五入,而不是默認MidpointRounding.ToEven
四捨五入
- 避免
System.OverflowException
當結果不適合Integer
(小於Integer.MinValue
或大於Integer.MaxValue
如Dim d = 2^31
)
- 如果VB.Net中的
CInt(1.5)
在C#中被不小心轉換爲(int)1.5
,則可能發生小的舍入錯誤。在VB.Net CInt(1.5)
是2,但在c#(int)1.5
是1
在ildasm.exe從
Dim d As Double = 2.5
Dim i1 As Integer = CInt(d) ' 2
Dim i2 As Integer = CType(d, Integer) ' 2
Dim i3 As Integer = d ' 2
Dim d2 = Int(d) ' 2.0
產生(在VS 2010 .NET 3.5)的CIL字節碼是:
IL_000f: ldc.r8 2.5
IL_0018: stloc.0
IL_0019: ldloc.0
IL_001a: call float64 [mscorlib]System.Math::Round(float64)
IL_001f: conv.ovf.i4
IL_0020: stloc.2
IL_0021: ldloc.0
IL_0022: call float64 [mscorlib]System.Math::Round(float64)
IL_0027: conv.ovf.i4
IL_0028: stloc.3
IL_0029: ldloc.0
IL_002a: call float64 [mscorlib]System.Math::Round(float64)
IL_002f: conv.ovf.i4
IL_0030: stloc.s i3
IL_0032: ldloc.0
IL_0033: call float64 [Microsoft.VisualBasic]Microsoft.VisualBasic.Conversion::Int(float64)
IL_0038: stloc.1
它顯示3次轉換編譯爲相同的呼叫默認Math.Round(Double)
和conv.ovf.i4
整數轉換。
因此,如果說使用'Math.Round(...,MidpointRounding.ToEven)'而不是'CInt',是不是真的會這麼說? – AlwaysLearning
如果你有兩種方法可以完成同樣的事情,那它有什麼不同?中頻性能是一個問題,然後選擇更快的。 – dbasnett