menu

天魔窟

勇往直前

Avatar

VBScript 的 bug?

Round 函数
返回按指定位数进行四舍五入的数值。
Round(expression[, numdecimalplaces])
参数
Expression
必选项。数值表达式 被四舍五入。
Numdecimalplaces
可选项。数字表明小数点右边有多少位进行四舍五入。如果省略,则 Round 函数返回整数。
说明
下面的示例利用 Round 函数将数值四舍五入到两位小数:
Dim MyVar, pi
pi = 3.14159
MyVar = Round(pi, 2) 'MyVar contains 3.14。

可是,Round(1.25, 1) 返回的是 1.2,而不是 1.3……

原因: PC 采用的是 “四舍六入五成双”,而不是 “四舍五入”的方式。
(footballboy(郑创斌) 提供的原因)

他的原因我也贴出来:

回复人: footballboy(郑创斌) 2002-5-30 11:48:13

我以前就发现这个问题,探究了一番.结果如下:
我这样理解,若需要舍入到的位的后面"小于5"或"大于5"的话,按通常意义的四舍五入处理.若"若需要舍入到的位的后面"精确等于5",则舍入后末位为偶数,举例

MsgBox "round(1.25,1)=" & Round(1.25, 1)

显示结果为1.2,因为1.2之后的尾数"精确等于5",舍入后末位要求是偶数,所以舍入结果是小数1.2而不是大数1.3

MsgBox "round(1.25001,1)=" & Round(1.25001, 1)

显示结果为1.3,因为1.2之后的尾数"大于5",按四舍五入处理

MsgBox "round(1.35,1)=" & Round(1.35, 1)

显示结果为1.4,因为1.2之后的尾数"精确等于5",舍入后末位要求是偶数,所以舍入结果是大数1.4而不是小数1.3

同理

MsgBox "round(1.345,2)=" & Round(1.345, 2)
MsgBox "round(1.355,2)=" & Round(1.355, 2)

显示结果分别是1.34和1.36

我总结出的舍入规律是"四舍六入五成双",这里"四"是小于五的意思,"六"是大于五的意思,"五"是舍入位之后的尾数"恰等于5".

回复人: footballboy(郑创斌) 2002-5-30 12:04:12 得分:100

补充一下,我认为从统计学的角度,"四舍六入五成双"比"四舍五入"要科学,它使舍入后的结果有的变大,有的变小,更平均.而不是像四舍五入那样逢五就入,导致结果偏向大数.

例如:1.15+1.25+1.35+1.45=5.2,若按四舍五入取一位小数计算

1.2+1.3+1.4+1.5=5.4

按"四舍六入五成双"计算,1.2+1.2+1.4+1.4=5.2,舍入后的结果更能反映实际结果

用这个bug能做些什么?

不算是 bug:)

评论已关闭