2013-11-12 6 views
1

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

Как я понимаю, круглый() должен «округлить до четности». Так как 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) 

ответ

1

MSDN имеет это сказать о функции Round() в VBA:

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

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

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

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

+0

Не тот ответ, на который я надеялся, но я ценю ваше время в поиске. – user2984879

2

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

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

+0

Я сожалею ; Я не очень хорошо объяснил этот вопрос. Я не хочу влиять на определенный результат. Я хочу понять результат, который происходит. См. [Link] (http://msdn.microsoft.com/en-us/library/se6f2zfx%28v=vs.84%29.aspx). Как говорится, в .5, круглая функция должна «округлить до четного». В этом случае он округляется до нечетного. Зачем? – user2984879

+0

Вы пробовали округлять до более десятичных знаков? –

+0

Если вы явно говорите (во втором аргументе) округлять до 0 десятичных знаков, возможно, именно поэтому он выходит как 229? –

0

Круглый не работает так, как вы ожидали. От MSDN:

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

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

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 
Смежные вопросы