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

发布于 2024-12-09 03:48:32 字数 549 浏览 5 评论 0原文

我偶然发现了 CInt 的问题并将双精度数转换为整数。

问题如下:

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

我习惯了 C# 样式转换,其中 (int) 10.51 为 10。

正如有关 Integer.Parse 与 CInt,结果只是以某种方式四舍五入。

然而,我所需要的只是获取整数部分并丢弃小数部分。如何在 VB.NET 中实现此类转换?经过一番研究后,我发现我可以使用 Fix() 函数来实现这一目的,但它是最好的选择吗?

I've stumbled upon an issue with CInt and converting a double to an integer.

The issue is the following:

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

I got used to C# style conversion where (int) 10.51 is 10.

As pointed out in the question about Integer.Parse vs CInt, the result is just rounded in some fashion.

However, all I need is to get only integer part and throw away the fractional one. How can I achieve such type of conversion in VB.NET? After some research I see that I can use the Fix() function to do the trick, but is it the best choice?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

琉璃繁缕 2024-12-16 03:48:33

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

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

小数部分。当您将非整数值转换为整数时
类型、整数转换函数(CByte、CInt、CLng、CSByte、
CShort、CUInt、CULng 和 CUhort)删除小数部分并
将值四舍五入到最接近的整数。

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

与在 C# 中使用 (int) 的最佳等效方式是 VisualBasic 命名空间中的 Fix 函数,该函数向零舍入(与 Math 相同) .截断)。

然而,这会返回一个 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

Firstly, your assumption that CInt is equivalent to (int) in C# is incorrect.

Secondly, the rounding behaviour of CInt is not randomly assigned - it actually uses "bankers rounding":

Fractional Parts. When you convert a nonintegral value to an integral
type, the integer conversion functions (CByte, CInt, CLng, CSByte,
CShort, CUInt, CULng, and CUShort) remove the fractional part and
round the value to the closest integer.

If the fractional part is exactly 0.5, the integer conversion
functions round it to the nearest even integer
. For example, 0.5
rounds to 0, and 1.5 and 2.5 both round to 2. This is sometimes called
banker's rounding, and its purpose is to compensate for a bias that
could accumulate when adding many such numbers together.

The best equivalent to using (int) in C# is the Fix function in the VisualBasic namespace which rounds towards zero (same as Math.Truncate).

This however returns a Double value so you have to do a further conversion to get to your integer using 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
臻嫒无言 2024-12-16 03:48:33

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

I think you can try CInt(Math.Floor(10.51))
hope this helps

最偏执的依靠 2024-12-16 03:48:32

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

  no = Convert.ToInt32(Int(10.51))

You may use Int or Fix functions but return value type of these functions is double so you have to convert it to Integer if option strict is on.

  no = Convert.ToInt32(Int(10.51))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文