CInt 不会一致地舍入 Double 值 - 如何删除小数部分?
我偶然发现了 CInt 的问题并将双精度数转换为整数。
问题如下:
CInt(10.5) 'Result is 10
CInt(10.51) 'Result it 11, but I expected 10...
我习惯了 C# 样式转换,其中 (int) 10.51
为 10。
正如有关 Integer.Parse 与 CInt,结果只是以某种方式四舍五入。
然而,我所需要的只是获取整数部分并丢弃小数部分。如何在 VB.NET 中实现此类转换?经过一番研究后,我发现我可以使用 Fix()
函数来实现这一目的,但它是最好的选择吗?
I've stumbled upon an issue with CInt and converting a double to an integer.
The issue is the following:
CInt(10.5) 'Result is 10
CInt(10.51) 'Result it 11, but I expected 10...
I got used to C# style conversion where (int) 10.51
is 10.
As pointed out in the question about Integer.Parse vs CInt, the result is just rounded in some fashion.
However, all I need is to get only integer part and throw away the fractional one. How can I achieve such type of conversion in VB.NET? After some research I see that I can use the Fix()
function to do the trick, but is it the best choice?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先,您认为
CInt
相当于 C# 中的(int)
的假设是不正确的。其次,
CInt
的舍入行为不是随机分配的 - 它实际上使用“银行家舍入”:与在 C# 中使用
(int)
的最佳等效方式是VisualBasic
命名空间中的Fix
函数,该函数向零舍入(与Math 相同) .截断
)。然而,这会返回一个 Double 值,因此您必须使用
CInt
进行进一步转换才能获得整数。Firstly, your assumption that
CInt
is equivalent to(int)
in C# is incorrect.Secondly, the rounding behaviour of
CInt
is not randomly assigned - it actually uses "bankers rounding":The best equivalent to using
(int)
in C# is theFix
function in theVisualBasic
namespace which rounds towards zero (same asMath.Truncate
).This however returns a Double value so you have to do a further conversion to get to your integer using
CInt
.我想你可以尝试
CInt(Math.Floor(10.51))
希望这有帮助
I think you can try
CInt(Math.Floor(10.51))
hope this helps
您可以使用
Int
或Fix
函数,但这些函数的返回值类型是 double,因此如果option strict
为option strict
,则必须将其转换为 Integer代码>上。You may use
Int
orFix
functions but return value type of these functions is double so you have to convert it to Integer ifoption strict
ison
.