关于Round(四舍五入)函数的Bug (0分)

L

lhzzj

Unregistered / Unconfirmed
GUEST, unregistred user!
本人最近写一个算法时,发现Round函数有Bug,下面是测试结果:
-2.5 ——> -2
-1.5 ——> -2 (错)
-0.5 ——> 0
0.5 ——> 0 (错)
1.5 ——> 2
2.5 ——> 2 (错)
3.5 ——> 4
4.5 ——> 4 (错)
5.5 ——> 6
6.5 ——> 6 (错)
7.5 ——> 8
8.5 ——> 8 (错)
9.5 ——> 10
10.5 ——> 10 (错)
11.5 ——> 12
12.5 ——> 12 (错)
13.5 ——> 14
14.5 ——> 14 (错)
15.5 ——> 16
16.5 ——> 16 (错)
17.5 ——> 18
18.5 ——> 18 (错)

不过还挺有规律的,如果整数部分是偶数,则向小的方向取,如果是奇数,这向大的方向取。
总之,一句话,就是偶数方向靠近,这可不是我们想要的四舍五入函数。
 
还真的是这样呀,以前没有发现,
 
所以说,以前大量使用Round的富翁们要注意了。
 
很久以前有人提出了。[:)]
 
这个不是错误,是统计学上的一个规定。
 
很久以前有人提出吗?这个倒没注意,不过再一次提出,可以让不知道的富翁们注意一下。
 
帮你踢一脚
 
你们都错了,这个函数没有错,
这并不是四舍五入的函数,它采用的舍入法为“银行家算法”,参见Delphi帮助
你有没有发现你的为什么是隔一个不像四舍五入?这正是银行家算法的特征
注意:在最近版本的Delphi Pascal 编译器中,
Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的。
这种处理器采用了所谓的 "银行家舍入法",
即对中间值 (如 5.5、6.5) 实施Round函数时,
处理器根据小数点前数字的奇、偶性来确定舍入与否,
如 5.5 Round 结果为 6,而 6.5 Round 结果也为6, 因为 6 是偶数。
 
同意LiChaoHui的!看来兄台学习一定非常好!
我才毕业不到半年“银行家算法”什么的全忘记了[:(]
等空下来了,一定复习一下。
 
都是国内pascal的教材惹的祸。
 
唉,这也郑重其事的拿出来说。
如果你要一个逢5必进的结果,
写一个函数,也不过几行。
 
顶部