专栏名称: 完美Excel
Excel与VBA技术学习与实践
目录
相关文章推荐
Excel之家ExcelHome  ·  几个常用函数公式,简单又高效 ·  5 天前  
完美Excel  ·  交互式图表示例:数数有多少个正方形 ·  4 天前  
Excel之家ExcelHome  ·  REGEXP函数,基础用法请收好 ·  1 周前  
Excel之家ExcelHome  ·  Excel中的翻译函数,130多种语言互译 ·  1 周前  
完美Excel  ·  使用VBA覆盖条件格式设置的单元格背景色 ·  1 周前  
51好读  ›  专栏  ›  完美Excel

使用VBA解决VBA四舍五入的问题

完美Excel  · 公众号  · Excel  · 2024-10-11 05:50

正文

学习Excel技术,关注微信公众号:
excelperfect

标签:VBA

Round函数可用于使用VBA对数字进行舍入。Round函数的运算非常简单,将要四舍五入的数字作为第一个参数输入,将要舍入的小数位数作为第二个可选参数输入。如果未指定要舍入的小数位数,则四舍五入为整数。

然而,许多人不知道的是,Round函数使用了一种相当不寻常的舍入机制,这可能会导致意外的四舍五入。

VBA中的舍入函数在遇到5时总是四舍五入到最接近的偶数。例如,2.35被四舍五入为2.4,但2.45也会被舍入为2.4,如下图1所示,这在很多情形下都不是应该的。

1
在大多数应用中,以5结尾的数字在正数时必须向上取整,在负数时向下取整,所以2.35应该变成2.42.45应该变成2.5-2.45应该变成-2.5

通常,可以将要四舍五入的数字加上或减去一个非常小的数字来避免这种情况,例如:

Function RoundHalfUp(dblNumber As Double, _   Optional iDecimal As Byte = 0) As Double RoundHalfUp = Round(dblNumber + Sgn(dblNumber) * 0.000001, iDecimal)End Function

此时,结果如下图2所示,正是我们想要的。

2
每个数字加上0.000001,于是2.45变成2.450001,然后数字正确地四舍五入到2.5。在大多情况下,这种方法很好,但并不完全可靠。首先,加法可能会得到一个以5结尾的数字,例如,如果基数是2.349999,再加上0.000001,那么加起来就是2.35,这会四舍五入为2.4,而2.349999应四舍五入为2.3。其次,VBA中的加法似乎会产生不同的结果,如下图3所示。

3
每个式子相加的结果都为2.65,按四舍五入应为2.6,但情况并非总是如此。这很可能是由于十进制数的二进制存储可能产生的不精确性。总之,表明在这些情况下,加法是不可靠的。

因此,更好的方法是只有当要四舍五入的数字以5结尾时才进行加法,这可以避免上述问题。函数代码:

Function RoundHalfUp(dblNumber As Double, _   Optional iDecimal As Byte = 0) As Double If Mid(dblNumber - Fix(dblNumber), iDecimal + 2 + Len(CStr(Sgn(dblNumber)))1) = "5" Then   dblNumber = dblNumber + Sgn(dblNumber) / 10 ^ (iDecimal + 1) End If RoundHalfUp = Round(dblNumber, iDecimal)End Function

该函数首先检查要四舍五入的位置是否有5,如果有,则将一个小数字加到正数上,从负数中减去一个小数字,因此5变成了6。然后用Round函数对这个数字进行四舍五入。此函数可用于以VBA的常用方式对数字进行四舍五入。

注:本文学习整理自worksheetsvba.com,供有兴趣的朋友研究。


欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。

推荐文章
Excel之家ExcelHome  ·  几个常用函数公式,简单又高效
5 天前
Excel之家ExcelHome  ·  REGEXP函数,基础用法请收好
1 周前
Excel之家ExcelHome  ·  Excel中的翻译函数,130多种语言互译
1 周前
美域健康  ·  免疫疗法是否能够消除早期癌症?
7 年前
卢松松  ·  小公司,大公司
7 年前