在Visual Basic中将数字转换为整数时如何确定四舍五入的方向

3

我正在尝试用Python复现一些Visual Basic代码。我有一个函数,它生成一个分数(double),并将其转换为整数,如下所示:

Dim random_int As Integer
Dim rounded_int As Integer
random_int = CInt(Math.Ceiling(Rnd() * n)) + 1
rounded_int = CInt(random_int/2)

CInt() 能将双精度浮点值四舍五入为最接近的整数。然而当值为0.5时,结果似乎是随机的,有时向上取整,有时向下取整。这使得代码难以测试。在Python(2.7)中,该数字总是朝着同一个方向进行舍入。

我可以添加或减去一个小数值(例如0.1),但原始代码不应更改。

这种行为是正常的,还是我可以以某种方式控制它?


3
根据在线手册页面:“当一个值的小数部分恰好为0.5时,CInt函数将四舍五入到最接近的偶数。例如,0.5四舍五入为0,1.5四舍五入为2,3.5四舍五入为4。将四舍五入到最接近的偶数的目的是为了补偿在许多数字相加时可能累积的偏差。” http://msdn.microsoft.com/en-us/library/fctcwhw9%28v=vs.84%29.aspx 《Hardly Random!》 - Mitch Wheat
谢谢Mitch。作为一个Python程序员,我曾经遇到过很多麻烦,因为两个看起来完全相同的程序却没有产生相同的输出结果。一开始我认为VB出了问题,但是VB的实现方式更加合理。 - chriskelly
1个回答

1

CInt在VBA中使用银行家舍入法,也称为“四舍六入五成双”。这就解释了其“随机”的行为。以下是一些例子:

2.5 -> 2
3.5 -> 4

您无法使用 CInt 自定义行为。历史上,微软的各种技术中舍入方法实现不一致,this KB article 说明了这一点,并为各种其他常见的舍入形式提供了代码示例。
另一个要点:由于浮点技术的限制,1.5 可能在内部表示为 1.4999999,进一步增加了混淆。本文 尝试解释为什么会发生这种情况以及如何解决它。 编辑:我假设您正在使用 Visual Basic for Applications,因为有 vba 标签,如果您正在使用 Visual Basic .NET,则可以使用 Math.Round 并带有 MidpointRounding 重载来调用。

我已经移除了VBA标签(Visual Basic没有标签,所以我使用了那个)。我猜银行家舍入也适用于VB。很好的简单明了的解释。谢谢! - chriskelly
1
@chriskelly 你可以使用 vb.net 标签。 - Bas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接