VBScript和浮点(双精度)数字:舍入函数返回错误的结果

vmg*_*vmg 4 floating-point vbscript floating-accuracy ieee-754

VBScript中的此类代码将返回错误的结果:

MsgBox Round(4.99985,4)
Run Code Online (Sandbox Code Playgroud)

它将返回,4.9998但正确的结果是4.9999。我知道这与VBScript如何使用带浮点数的数字有关,有些数字无法用二进制表示,但是请告诉我:

  1. 这里到底发生了什么?
  2. 可能的解决方法是什么?

谢谢!

Hel*_*len 5

这是预期的结果,即所谓的银行家四舍五入。查看功能说明Round(由我加粗):

Round函数执行从整到整的操作,这与取整到较大的操作不同。...如果表达式恰好位于两个可能的取整值之间的中间位置,则该函数返回其最右边的数字为偶数的可能的取整值。


要四舍五入,可以使用以下函数(从此处获取):

Function RoundToLarger(ByVal Number, ByVal NumDigitsAfterDecimal)
  RoundToLarger = CDbl(FormatNumber(Number, NumDigitsAfterDecimal))
End Function
Run Code Online (Sandbox Code Playgroud)

(注意:负数四舍五入。)