CInt不会一致地舍入Double值 - 如何删除小数部分?

nbu*_*lba 9 .net vb.net rounding c#-to-vb.net

我偶然发现了CInt的一个问题并将double转换为整数.

问题如下:

CInt(10.5)  'Result is 10
CInt(10.51) 'Result it 11, but I expected 10...
Run Code Online (Sandbox Code Playgroud)

我习惯了C#风格转换,其中(int) 10.5110.

正如在关于Integer.Parse和CInt的问题中指出的那样,结果只是以某种方式舍入.

但是,我只需要获得整数部分并扔掉小数部分.如何在VB.NET中实现这种类型的转换?经过一些研究后,我发现我可以使用该Fix()功能来完成这个技巧,但它是最好的选择吗?

ada*_*ost 8

您可以使用IntFix函数但这些函数的返回值类型是double,因此如果option strict是,则必须将其转换为Integer on.

  no = Convert.ToInt32(Int(10.51))
Run Code Online (Sandbox Code Playgroud)

  • 结合这两个答案,我认为`CInt(Int(10.51))`应该有效;) (2认同)

Mat*_*lko 5

首先,您的CInt等同(int)于C#的假设是不正确的。

其次,的舍入行为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
Run Code Online (Sandbox Code Playgroud)