将"Double"或"Single"转换为"Integer"的最简洁方法,无需舍入

sup*_*cat 6 vb.net floating-point type-conversion

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

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

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

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

Kon*_*lph 5

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

\n\n

C#(int)转换直接转换为conv.i4IL 中的转换。VB没有这样的运算符,并且似乎没有框架函数提供替代方案。

\n\n

Usenet 在 2005 年对此进行了一次有趣的讨论\xe2\x80\x93\xc2\xa0 当然,自那时以来发生了很多变化,但我认为这仍然成立。

\n