使用CInt或将浮点数转换为整数CType
将导致该数字的值被四舍五入。该Int
函数 和Math.Floor
可用于将浮点数转换为整数,向负无穷大舍入,但两个函数都返回浮点值,这些浮点值不能在没有强制转换的情况下隐式用作Integer
值。
是否有简洁和惯用的替代方法IntVar = CInt(Int(FloatingPointVar));
?Pascal 包含Round
和Trunc
返回的函数Integer
;在 VB.NET 语言或 .NET 框架中是否有一些等价物?
一个类似的问题,CInt 不会一致地舍入 Double 值 - 如何删除小数部分?在 2011 年被问到,但它只是询问是否有办法将浮点数转换为整数;答案提出了一个两步过程,但它没有深入了解框架中存在或不存在的内容。我很难相信框架没有类似于Pascal的东西 Trunc
函数,因为在使用浮点操作数执行图形操作时经常需要这样的东西[此类操作需要呈现为离散像素,并且应该以这样的方式舍入round(x)-1 = round(x -1) 适用于 +/- (2^31-1) 范围内的所有 x;即使这样的操作被四舍五入,也应该使用Floor(x+0.5),而不是四舍五入,以保证上述性质]
顺便说一句,在 C# 中,从使用符号Double
到Int
使用(type)expr
符号的类型转换使用舍入到零的语义;这与 VB.NET 行为不同的事实表明,一种或两种语言都使用自己的转换例程,而不是框架中包含的显式转换运算符。框架似乎应该定义一个转换运算符?框架内是否存在这样的运算符?它有什么作用?有没有办法从 C# 和/或 VB.NET 调用它?