Ошибка округления в ASP (vbscript)
Я очень мало знаю об ASP или Vb Script. Я пытаюсь устранить ошибку, из-за которой процедура, написанная на классическом ASP, неожиданно округляется до меньшего числа ODD.
Насколько я понимаю, Round() должен быть округлен до четного. Поскольку 720 * 51 / 160 = 229,5, Раунд (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 )
4 ответа
У MSDN есть это, чтобы сказать о функции Round() в VBA:
Хотя функция округления полезна для возврата числа с указанным числом десятичных знаков, вы не всегда можете предсказать, как оно будет округляться, когда цифра округления равна 5. Как VBA округляет число, зависит от внутреннего двоичного представления этого числа.
Это не говорит то же самое о VBScript, но я рискну предположить, что происходит то же самое.
В итоге, если вам нужна функция Round(), которая на самом деле будет вести себя предсказуемо, вам придется написать свою собственную.: /
(Если вы хотите, чтобы функция выполняла "нормальное" округление, а не какую-то причудливую формулу "округлить до четности", используйте FormatNumber(). Насколько я знаю, она действительно ведет себя предсказуемо, то есть x.5 всегда будет округляться.)
Вы могли бы сделать
MlsSrvAmsFr = Round((CLng(SetZero(TotMlsSrvAms)) * tmpPct) + 0.5, 0
Добавление 0.5 является дополнением к вашему коду. Я не думаю, что есть встроенная функция Ceil в VBScript?
Я считаю, что округление всегда будет идти вниз. Таким образом, добавление 0.5 приведет к результату, который вы ищете.
0,1 + 0,5 = 0,6 Раунд (0,6) = 0
0,7 + 0,5 = 1,2 раунда (1,2) = 1
Раунд это боль, это 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
Раунд не работает так, как вы ожидаете. Из MSDN:
Функция Round выполняет округление до четности, которое отличается от округления к большему. Возвращаемое значение - это число, наиболее близкое к значению выражения, с соответствующим количеством десятичных знаков. Если выражение находится точно посередине между двумя возможными округленными значениями, функция возвращает возможное округленное значение, крайняя правая цифра которого является четным числом. (В функции округления до большего числа, которое находится посередине между двумя возможными округленными значениями, всегда округляется до большего числа.)
Кажется, что алгоритм округления не так однозначен, как это подразумевается в примерах, и это выглядит как еще один пример, где результат немного отличается от ожидаемого.