我有一个应用程序,用于将最接近的匹配返回到大型值集合中的某些值(如我之前的question),我选择了VBA解决方案。在使用上述申请的过程中,我观察到0.5值的结果不正确。我一直在使用VBA Round函数,我发现它返回0表示0.5舍入到整数,而工作表round函数返回1.奇怪的是,VBA round函数返回2表示1.5。我不得不用工作表函数代替VBA函数。
我错过了什么吗?
答案 0 :(得分:3)
这是一个已知问题。 VBA Round()函数使用Banker的舍入,而电子表格单元格函数使用算术舍入。查看详细信息:
PRB: Round Function different in VBA 6 and Excel Spreadsheet
Microsoft提出的解决方法是编写自定义函数以获得所需的结果。
银行家的舍入总是将0.5舍入到最近的偶数号码,并且是会计的标准,这就是Excel以这种方式运作的原因。 算术舍入将0.5舍入到下一个数字。
答案 1 :(得分:2)
你可以责怪微软:http://support.microsoft.com/kb/194983
以下是解决此问题的方法列表:http://www.excelforum.com/excel-programming/401104-worksheet-rounding-vs-vba-rounding.html
答案 2 :(得分:2)
问题完全回答here并在此复制(经作者许可:):
小心,VBA Round函数使用Banker的舍入,它将.5舍入为偶数,如下所示:
Round (12.55, 1) would return 12.6 (rounds up)
Round (12.65, 1) would return 12.6 (rounds down)
Round (12.75, 1) would return 12.8 (rounds up)
Excel工作表功能回合,总是向上舍入.5。
我已经完成了一些测试,它看起来像.5向上舍入(对称舍入)也用于单元格格式化,也用于列宽舍入(当使用常规数字格式时)。 '精确显示'标志似乎不会进行任何舍入,它只使用单元格格式的舍入结果。
我尝试在VBA中实现Microsoft的SymArith功能进行舍入,但是当你试图给它一个像58.55这样的数字时,发现Fix有错误。函数给出58.5而不是58.6的结果。然后我终于发现你可以使用Excel工作表Round函数,如下所示:
Application.Round(58.55,1)
这将允许您在VBA中进行正常的舍入,尽管它可能不如某些自定义函数快。我意识到问题已经完全循环,但是想要将其包括在内以便完整。