Ошибка округления в ASP (vbscript)

Я очень мало знаю о ASP или Vb Script. Я пытаюсь устранить ошибку, из-за которой процедура, написанная на классическом ASP, неожиданно округляется до меньшего нечетного числа.

Насколько я понимаю, Round() должен «округляться до четного». Поскольку 720 * 51/160 = 229,5, Round(720 * 51/160, 0) должен равняться 230. Однако страница ASP постоянно возвращает 229.

Фактический код ASP скопирован ниже. Переменные в этом экземпляре следующие:

FreeElig = 51
RedcElig = 0
PaidElig = 109
TotMlsSrvAms = 720
MlsSrvAmsFr is returning the questionable value.

Я ценю любую помощь, которую вы можете предоставить.

Спасибо.

Sub ClaimCalcs()

Dim tmpTtlEnroll, tmpFreeEnroll, tmpRedcEnroll, tmpPaidEnroll, tmpPct
Dim GreaterValue

tmpFreeEnroll = CLng(SetZero(FreeElig)) 
tmpRedcEnroll = CLng(SetZero(RedcElig)) 
tmpPaidEnroll = CLng(SetZero(PaidElig))

tmpTtlEnroll = tmpFreeEnroll + tmpRedcEnroll + tmpPaidEnroll

If tmpTtlEnroll > 0 Then 
    tmpPct = tmpFreeEnroll / tmpTtlEnroll
Else    
    tmpPct = 0
End If

MlsSrvAmsFr = Round(CLng(SetZero(TotMlsSrvAms)) * tmpPct, 0 )

person user2984879    schedule 12.11.2013    source источник


Ответы (4)


Об этом сообщает MSDN. о функции Round() в VBA:

Хотя функция округления полезна для возврата числа с заданным количеством знаков после запятой, вы не всегда можете предсказать, как оно будет округляться, если цифра округления равна 5. То, как VBA округляет число, зависит от внутреннего двоичного представления этого числа.

Это не говорит того же о VBScript, но рискну предположить, что происходит то же самое.

Суть в том, что если вам нужна функция Round(), которая действительно будет вести себя предсказуемо, вам придется написать свою собственную. :/

(Если вам нужна функция, которая выполняет «нормальное» округление, а не какую-то причудливую формулу «округления до четного», используйте FormatNumber(). Насколько я знаю, она на самом деле ведет себя предсказуемо, т.е. x.5< /em> всегда будет округляться.)

person Martha    schedule 12.11.2013
comment
Не тот ответ, на который я надеялся, но я ценю ваше время, потраченное на его поиск. - person user2984879; 13.11.2013

Вы могли бы сделать

MlsSrvAmsFr = Round((CLng(SetZero(TotMlsSrvAms)) * tmpPct) + 0.5, 0 

Добавление 0,5 является дополнением к вашему коду. Я не думаю, что в VBScript есть встроенная функция Ceil?

Я считаю, что округление всегда будет снижаться. Таким образом, добавление 0,5 приведет к результату, который вы ищете.

0,1 + 0,5 = 0,6 Раунд(0,6) = 0

0,7 + 0,5 = 1,2 Раунд(1,2) = 1

person Lee Brindley    schedule 12.11.2013
comment
Мне жаль; Я плохо объяснил проблему. Я не хочу влиять на определенный вывод. Я хочу понять вывод, который происходит. См. ссылку. Как говорится, при 0,5 функция округления должна «округляться до четного». В этом случае оно округляется до нечетного. Почему? - person user2984879; 13.11.2013
comment
Если вы прямо говорите (во втором аргументе) округлить до 0 знаков после запятой, возможно, поэтому оно получается как 229? - person Lee Brindley; 13.11.2013
comment
@Fendorio, пожалуйста, прочитайте вопрос более внимательно. VBScript Round() должен округлять до ближайшего четного целого числа, если десятичное число точно равно 0,5. По какой-то причине с 229,5 получается неправильно: ближайшее четное целое число равно 230, а функция возвращает 229. - person Martha; 13.11.2013

Круглый это боль vbs

вот некоторые функции, которые я нашел в Интернете, которые помогли мне на протяжении многих лет

Function Floor(Number)
   Floor = Int(Number)
End Function

Function Ceil(Number)
    Ceil = Int(Number)
    If Ceil <> Number Then Ceil = Ceil + 1
End Function

Function Rounding(Number)
   Rounding = Floor(Number)
   If Number - Rounding >= .5 Then Rounding = Rounding + 1
End Function
person Thomas Albrighton    schedule 13.11.2013

Раунд работает не совсем так, как вы ожидаете. Из MSDN:

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

Кажется, что алгоритм округления не настолько однозначен, как это следует из примеров, и это выглядит как еще один пример того, где результат немного отличается от ожидаемого.

person AnonJr    schedule 12.11.2013