7

使用CInt或将浮点数转换为整数CType将导致该数字的值被四舍五入。该Int函数 和Math.Floor可用于将浮点数转换为整数,向负无穷大舍入,但两个函数都返回浮点值,这些浮点值不能在没有强制转换的情况下隐式用作Integer值。

是否有简洁和惯用的替代方法IntVar = CInt(Int(FloatingPointVar));?Pascal 包含RoundTrunc返回的函数Integer;在 VB.NET 语言或 .NET 框架中是否有一些等价物?

一个类似的问题,CInt 不会一致地舍入 Double 值 - 如何删除小数部分?在 2011 年被问到,但它只是询问是否有办法将浮点数转换为整数;答案提出了一个两步过程,但它没有深入了解框架中存在或不存在的内容。我很难相信框架没有类似于Pascal的东西 Trunc函数,因为在使用浮点操作数执行图形操作时经常需要这样的东西[此类操作需要呈现为离散像素,并且应该以这样的方式舍入round(x)-1 = round(x -1) 适用于 +/- (2^31-1) 范围内的所有 x;即使这样的操作被四舍五入,也应该使用Floor(x+0.5),而不是四舍五入,以保证上述性质]

顺便说一句,在 C# 中,从使用符号DoubleInt使用(type)expr符号的类型转换使用舍入到零的语义;这与 VB.NET 行为不同的事实表明,一种或两种语言都使用自己的转换例程,而不是框架中包含的显式转换运算符。框架似乎应该定义一个转换运算符?框架内是否存在这样的运算符?它有什么作用?有没有办法从 C# 和/或 VB.NET 调用它?

4

4 回答 4

4

经过一番搜索,VB似乎没有干净的方法来实现这一点,只需要编写一个扩展方法。

C#(int)转换直接转换conv.i4为 IL。VB 没有这样的操作符,而且似乎没有框架函数可以提供替代方案。

早在 2005 年,Usenet 就对此进行了一次有趣的讨论——当然从那以后发生了很多变化,但我认为这仍然存在。

于 2013-02-04T18:27:37.790 回答
1

您可以使用该Math.Truncate方法。

计算指定双精度浮点数的整数部分。

例如:

Dim a As double = 1.6666666
Dim b As Integer = Math.Truncate(a) ' b = 1
于 2013-02-04T19:30:44.247 回答
0

我知道这是一个老案例,但我没有看到有人建议使用 Math.Round() 函数。

是的 Math.Round 需要一个双精度并返回一个双精度。但是,它返回一个已四舍五入为整数的数字。它应该使用 cInt 轻松简洁地转换为整数。这样就够了吗?

cInt(math.round(10000.54564)) ' = 10001 cInt(math.round(10000.49564)) ' = 10000

于 2018-05-14T13:51:00.523 回答
-4

您可能需要提取浮点数的 Int 部分:

float num = 12.234;
string toint = "" + num;
string auxil = toint.Split('.');
int newnum = Int.Parse(auxil[0]);
于 2013-02-04T17:31:46.313 回答