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()功能来完成这个技巧,但它是最好的选择吗?
您可以使用Int或Fix函数但这些函数的返回值类型是double,因此如果option strict是,则必须将其转换为Integer on.
no = Convert.ToInt32(Int(10.51))
Run Code Online (Sandbox Code Playgroud)
首先,您的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)
| 归档时间: |
|
| 查看次数: |
20321 次 |
| 最近记录: |