2011-10-07 53 views
8

我偶然发现了CInt的一个问题,并将double转换为整数。CInt不会一致地舍入Double值 - 如何删除小数部分?

问题如下:

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()函数来实现这个诀窍,但它是最好的选择吗?

+2

更糟:CINT(10.5)= 10,但CINT(11.5)= 12如果整数部分甚至四舍五入的0.50000000是向下,对于奇数它是由! – Martin

回答

8

您可以使用IntFix功能,但返回的这些函数值类型是双所以你必须把它转换为整数。如果option stricton

no = Convert.ToInt32(Int(10.51)) 
+0

我喜欢这种方式,第一个更好。非常感谢,AVD! – nbulba

+2

结合这两个答案,我认为'CInt(Int(10)51))'应该工作;) –

1

我想你可以尝试CInt(Math.Floor(10.51)) 希望这有助于

+4

请注意,对于负数,这可能不会产生预期的结果:'Math.Floor(-10.51)'是'-11'。如果你想要'-10',你可以使用'Math.Truncate'。 –

4

首先,你的假设是CInt相当于(int)在C#中不正确。

其次,CInt舍入行为不是随机分配 - 它实际上使用“银行家舍入”:

部分分式。将非整数值转换为整型 类型时,整数转换函数(CByte,CInt,CLng,CSByte,CShort,CUInt,CULng和CUShort)将删除小数部分并将值舍入为最接近的整数。

如果小数部分刚好是0.5,整数转换 将其四舍五入到最接近的偶数整数。例如,0.5 轮到0,1.5和2.5都轮到2.这有时被称为 银行家的四舍五入,其目的是为了补偿在将许多这样的数字加在一起时可能累积的偏差。

最好等同于C#中使用(int)处于VisualBasic命名空间中的Fix功能这轮朝向零(同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