Skip to content

关于ASP四舍五入Round()函数结果不正确

在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

参考文献:

相关日志

  • 暂无相关日志

Categories: 技术.

Tags:

Comment Feed

No Responses (yet)



Some HTML is OK

or, reply to this post via trackback.

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word