当我们在Visual Basic 6.0中将float转换为整数时,它如何使小数部分变圆?我正在谈论自动类型转换.
如果我们分配喜欢
Dim i as Integer i=5.5 msgbox i
它会打印什么?5或6 ??
几个月前我得到了"5".有一天它开始给我6个!任何想法都错了吗?微软是否发布了一些补丁来解决问题?
更新:5.5转换为6但8.5到8!
更新2:添加CInt没有任何区别.CInt(5.5)给出6,而Cint(8.5)得到8!有点喜欢的行为.我应该尝试像地板(x + 0.49);
更新:在一些谷歌搜索后,我发现了以下文章:
它不是一个"bug",它是VB设计工作的方式.它使用一种称为银行家舍入的东西,如果数字正好以5结尾并且你想要绕到5前面的位置,那么如果5位置前面的数字是偶数则向下舍入数字,否则向上舍入.它应该使用四舍五入的数字来防止重复计算,这样答案并不总是偏向上.有关此问题的更多信息,请参阅此链接
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q196652
这解释了(明显的)奇怪的行为:
Cint(5.5) 'Should be 6' Cint(8.5) 'Should be 8'
旧更新:
也许您应该更明确:使用CInt
,而不是简单地将浮点数赋给整数.例如:
Dim i as Integer i = CInt(5.5) MsgBox i
部分内容在VB6帮助中:主题类型转换函数.不幸的是,这是MSDN网站上的VB6文档中没有的主题之一,但是如果你已经安装了VB6的帮助,它就会在那里.
当小数部分恰好为0.5时,CInt和CLng总是将其四舍五入到最接近的偶数.例如,0.5 轮到0,1.5轮到 2. CInt和CLng与Fix和Int函数不同,它们截断而不是舍入数字的小数部分.此外,Fix和Int始终返回与传入的类型相同的值.
隐式类型强制 - 又名"邪恶类型强制(PDF)" - 从浮点数到整数使用与CInt和CLng相同的舍入规则.在手册中的任何位置似乎都没有记录此行为.
如果你想在小数部分> = 0.5时向上舍入,否则向下舍入,一个简单的方法就是
n = Int(x + 0.5)
和关闭的顶部我的头,这是我的迈克Spross的简短的版本RoundNumber :)这对于VB6 Round函数的替代品.
'Written off the top of my head, seems to work. Public Function RoundNumber(ByVal value As Double, Optional PlacesAfterDecimal As Integer = 0) As Double Dim nMultiplier As Long nMultiplier = 10 ^ PlacesAfterDecimal RoundNumber = Int(0.5 + value / nMultiplier) * CDbl(nMultiplier) End Function
样本输出:
Debug.Print RoundNumber(1.6) '2' Debug.Print RoundNumber(-4.8) '-5' Debug.Print RoundNumber(101.7) '102' Debug.Print RoundNumber(12.535, 2) '12.54'