VBScript и числа с плавающей точкой (double): функция округления возвращает неверный результат - PullRequest
3 голосов
/ 14 марта 2012

такой код в VBScript вернет неправильный результат:

MsgBox Round(4.99985,4)

Возвращается 4.9998, но правильный результат 4.9999. Я знаю, что это связано с тем, как VBScript работает с числами с плавающей точкой, что некоторые числа не могут быть представлены в двоичной системе, но, пожалуйста, сообщите мне:

  1. Что именно здесь происходит?
  2. Каков возможный обходной путь для этого?

Спасибо!

1 Ответ

4 голосов
/ 14 марта 2012

Это ожидаемый результат, так называемое банковское округление . Ознакомьтесь с описанием функции Round (выделено мной жирным шрифтом):

Функция Round выполняет округление до четного , которое отличается от округление до большего . ... Если выражение находится точно посередине между двумя возможными округленными значениями, функция возвращает возможное округленное значение, у которого крайняя правая цифра является четным числом .


Чтобы округлить до большего, вы можете использовать следующую функцию (взято из здесь ):

Function RoundToLarger(ByVal Number, ByVal NumDigitsAfterDecimal)
  RoundToLarger = CDbl(FormatNumber(Number, NumDigitsAfterDecimal))
End Function

(Примечание: отрицательные числа округляются в меньшую сторону.)

...