到底是哪里错了?Excel中的四舍五入和VBA的四舍五入竟然不一样?

今天介绍一个Excel中的“错误”:关于四舍五入的。

先来看数据以及在Excel中的四舍五入的结果:

这个结果毫无问题,符合我们从小学就学习的四舍五入的概念,不到.5的都舍掉,超过.5(包含.5)的都进位。所以,2.4就变成了2,而-2.5变成了-3。

现在,我们打开Excel的VBA编辑器,插入一个模块,在其中输入下面的一段代码:

Sub t() For i = 3 To 22 Sheet1.Cells(i, 5).Value = Round(Sheet1.Cells(i, 2).Value, 0) Next iEnd Sub

代码中的VBA是VBA中的四舍五入函数,它的用法跟Excel中的同名函数是一样的,作用也相同,但是结果却不一样:

我们看到,在除了2.5,-2.5之外的所有其他数字上,用Excel的ROUND函数和用VBA的ROUND函数结果是相同的。

在2.5和-2.5时,用Excel的Round函数是向上进位(姑且这么说吧),而用VBA的Round函数是是向下舍掉。

那么是不是就是这个规律呢?当然不是。往下看,轮到3.5和-3.5时,Excel的Round函数保持原来的规律不变,但是VBA的Round函数却发生了变化,重新变回了“向上进位”。

这是为什么呢?到底是谁错了?

这里没有哪个函数出错。这是因为这两个函数采用了不同的四舍五入的方案。

我们普通理解四舍五入就是所有小于.5的数字舍掉,大于等于.5的数字进位。但是纯粹从数字角度的来看,这么做,对于小于.5和大于.5的数字没有任何争议。但是当数字等于.5时,这个规定就有点人为的痕迹了。.5距离两边相等,无论舍掉还是进位都造成了“不公平”的结果。此时,就有两种方案,这两种方案从它们各自的英文名称来解释就一目了然。

方案1. AwayFromZero

中文意思就是远离0的方向。就是说当等于.5的时候,就像远离0的方向进行舍入操作。因此,2.5就变成了3,因为3比2离0更远;而3.5变成了4,因为4比3离0更远。在负的方向上,-2.5变成了-3,-3.5变成了-4(其实不是进位)。

Excel中的Round函数就用了这个方案。

方案2. ToEven

Even是偶数的意思,这个方案就是将.5向最近的偶数进行舍入操作。因此,2.5变成了2(2是留2.5最近的偶数),3.5变成了4(4是留3.5最近的偶数)。而-2.5也变成了-2,-3.5变成了-4。

VBA中的Round函数就用了这个方案。

你在使用的时候也注意这两种区别,看看究竟哪种方案符合你的场景要求。

在Excel中,还有一个地方用到了舍入函数,那就是Power Query。那么,在Power Query中这个四舍五入是怎么处理的?使用的是哪种方案?还有,为什么Excel会采用两种不同的方案呢?我在下一篇中给大家详细介绍。

(0)

相关推荐