|
|
|
| Работал с фориматом Currency, потерял копейку. Мелочь, но задолбали. Берем А=0,21499 из текстового окна . Свожу для краткости 2 операции в одну. Round(CCur(A),2)=0,22
Берем A=0,22499 Результат тот же Round(CCur(A),2)=0,22 Если вторую девятку убираем - все ОК. Используем функцию CSng() - тоже все ОК. Результат первого варианта зависит от того четная или нечетная вторая цифра после запятой. Что бы это значило? | |
|
| |
|
|
|
| ?ccur(0.21499)
0.215
?Round(0.21499,2)
0.21
?Round(ccur(0.21499),2)
0.22 | |
|
| |
|
|
|
| обширное обсуждение этого вопроса осталось на старом форуме
http://hiprog.com/forum/read.php?id_forum=1&id_theme=1543&page=1 | |
|
| |
|
|
|
| Спасибо за ссылку, а то я слышал звон , но не помнил, откуда. Однако...
Берем рекомендованную
Function SymArith(ByVal X As Double, _
Optional ByVal Factor As Double = 1) As Double
SymArith = Fix(X * Factor + 0.5 * Sgn(X)) / Factor
Заряжаем
?symarith(0.15,10)
X * Factor + 0.5 * Sgn(X)= 2
Fix(X * Factor + 0.5 * Sgn(X))= 1
0,1
Не понял... Проверяю
?fix(2)
2
Ага, вроде Fix работает
В общем началость округление к нечетным, вместо банковского округления к четным
?symarith(0.25,10)
0,3
?symarith(0.35,10)
0,3
_______________
Через пол-часа...
Еще несколько пасов и ...
Dim C as Double
C = X * Factor + 0.5 * Sgn(X)
SymArith = Fix(C)/ Factor
и все в ажуре
?SymArith(0.15,1)
0,2
Однако.... | |
|
| |
|
|
|
| Фокус в том, что CCur() округляет до 4 десятичных знаков, причем делает это по собственным, одной ей и Билу Гейтсу понятным правилам.
?ccur(0.11115)
0.1111
?ccur(0.11125)
0.1113
?ccur(0.11135)
0.1114
?ccur(0.11145)
0.1114
?ccur(0.11155)
0.1115
?ccur(0.11165)
0.1116
?ccur(0.11175)
0.1118
?ccur(0.11185)
0.1119
?ccur(0.11195)
0.1119
Только выделенные числа соответствуют принципу "до ближайшего четного" который используют CLng() и Round(). Кстати этот принцип бухгалтерии тоже не понравится. | |
|
| |