微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net – 最简单的方法将`Double`或`Single`转换为`Integer`,而不进行舍入

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

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

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

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

解决方法

经过一番搜索,似乎VB没有简洁的方法来完成,没有编写扩展方法.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐