Dot-Net

CInt 不會一致地舍入 Double 值 - 如何刪除小數部分?

  • August 27, 2015

我偶然發現了CInt的問題並將雙精度轉換為整數。

問題如下:

CInt(10.5)  'Result is 10
CInt(10.51) 'Result it 11, but I expected 10...

我習慣了 C# 樣式轉換,那裡(int) 10.51是 10。

正如關於Integer.Parse vs CInt的問題所指出的那樣,結果只是以某種方式四捨五入。

但是,我只需要獲取整數部分並丟棄小數部分。如何在 VB.NET 中實現這種類型的轉換?經過一些研究,我發現我可以使用該Fix()功能來解決問題,但它是最佳選擇嗎?

您可以使用IntorFix函式,但這些函式的返回值類型是 double 因此您必須將其轉換為 Integer if option strictis on

 no = Convert.ToInt32(Int(10.51))

首先,您在 C# 中的假設CInt是不正確的。(int)

其次, 的捨入行為CInt不是隨機分配的——它實際上使用“銀行家四捨五入”:

小數部分。將非整數值轉換為整數類型時,整數轉換函式(CByte、CInt、CLng、CSByte、CShort、CUInt、CULng 和 CUShort)會刪除小數部分並將值四捨五入為最接近的整數。

如果小數部分正好是 0.5,整數轉換函式會將其四捨五入到最接近的偶數整數。例如,0.5 舍入為 0,1.5 和 2.5 都舍入為 2。這有時稱為銀行家舍入,其目的是補償在將許多此類數字相加時可能累積的偏差。

(int)與在 C# 中使用的最佳等價物是命名空間中的Fix函式,該函式VisualBasic向零舍入(與 相同Math.Truncate)。

但是,這會返回一個 Double 值,因此您必須進行進一步的轉換才能使用CInt.

CInt(Fix(10.5)) '10
CInt(Fix(10.51)) '10
CInt(Fix(11.5)) '11
CInt(Fix(-10.5)) '-10
CInt(Fix(-10.51)) '-10
CInt(Fix(-11.5)) '-11

引用自:https://stackoverflow.com/questions/7684176