vb.net - 将 `Double` 或 `Single` 转换为 `Integer` 的最简洁方法,无需舍入

标签 vb.net floating-point type-conversion

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

是否有一个简洁且惯用的替代方案来替代 IntVar = CInt(Int(FloatingPointVar));? Pascal 包含返回 Integer 的 RoundTrunc 函数; VB.NET 语言或 .NET 框架中是否有等效项?

类似的问题, CInt does not round Double value consistently - how can I remove the fractional part? 在2011年就被问过,但只是问是否有一种方法可以将 float 转换为整数;答案建议分两步进行,但没有深入探讨框架中存在或不存在的内容。我很难相信该框架不会有类似于 Pascal 的东西。 Trunc 函数,考虑到在使用浮点操作数执行图形操作时经常需要这样的东西[此类操作需要渲染为离散像素,并且应该以舍入的方式舍入( x)-1 = round(x-1) 对于所有在 +/- (2^31-1) 范围内的 x;即使这样的运算是四舍五入的,也应该使用Floor(x+0.5),而不是四舍五入到最接近的偶数,这样才能保证上述性质]

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

最佳答案

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

C# (int) 转换直接转换为 IL 中的 conv.i4VB has no such operators ,并且似乎没有框架功能提供替代方案。

Usenet had an interesting discussion about this back in 2005 – 当然,自那时以来发生了很多变化,但我认为这一点仍然成立。

关于vb.net - 将 `Double` 或 `Single` 转换为 `Integer` 的最简洁方法,无需舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14691978/

相关文章:

asp.net - 什么时候应该使用工厂模式?

.net - 在消息框/对话框上添加单选按钮

php - SQL 语法错误似乎可以找到正确的查询

c++ - 从 BSTR 转换为 char*

vb.net - 获取目录中的所有文件夹和子文件夹

c - C 上的浮点表示错误

java - java中的向下舍入 float 转换

python - 转换为 float 时出错,然后在 python 中转换为 int

c# - 将不同类型的变量分配给一种类型

swift - 在 Apples Swift 3 beta 6 中使用 withMemoryRebound