在ASP下面处理四舍五入时我们都会对自带的Round()函数,但是实际上他的四舍五入和我们在数学当中所认识的有所区别,看下面的例子:

Round(1.5)
Round(2.5)
Round(3.5)
Round(4.5)

以上的结果会是什么呢?按我们正常数学当中的四舍五入法依次结果为:2 3 4 5。但是非常抱歉的告诉您,Round()在大于5入、小于5舍、等于5的话奇数弃偶数舍,最终他只会给你:2 2 4 4。那么到底是什么原因促使这样呢?让我给你娓娓道来。

来看一段商家使用“四舍五入”法来针对找零方式,看他们是如何去用数学从中获取的“暴利”,按我们正确理解四舍五入1-4舍(4个数)、5-9入(5个数),按概率来算舍是44.44%、入55.56%,也就是说商家比顾客多11.2%机会,如果将“舍”和“入”相抵那么商家多赚了钱。(PS:以后身上还是多带点零用钱吧,坚持不让这种情况发生)

由于这种“四舍五入”法的不公平,天才们想到了一种叫“四舍六入五成双”相比“四舍五入”是一种精确度的计数保留法。这里“四”是小于五的意思,“六”是大于五的意思,“五”是舍入位之后的尾数逢五的话看前一位,奇进偶不进。

由上面定义我们就知道示例中的结果并不是我日常所见,但是他是结果切是最科学的、最合理的。有人会说了,既然我们日常用惯“四舍五入”法,那我们怎么办?方法当然很多,你可以按四舍五入的定义写个特有方法,而其实有一个更加方便的方式:

FormatNumber()  作为数字被格式化的表达式

FormatNumber(1.5, 0)   ’2
FormatNumber(2.5, 0)   ‘3
FormatNumber(3.5, 0)   ’4
FormatNumber(4.5, 0)   ‘5

格式化数字,而他会比较接近我们“日常四舍五入”法,但是注意他是个数字格式化,所以还是建议您自己一个方法来处理:

Function Round2(ByVal num)
Round2 = Fix(CDbl(num) + 0.5)
End Function

参考文献: