Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: В чем фокус?
 
 автор: grafin   (23.10.2007 в 15:33)   личное сообщение
 
 

Работал с фориматом Currency, потерял копейку. Мелочь, но задолбали. Берем А=0,21499 из текстового окна . Свожу для краткости 2 операции в одну. Round(CCur(A),2)=0,22
Берем A=0,22499 Результат тот же Round(CCur(A),2)=0,22 Если вторую девятку убираем - все ОК. Используем функцию CSng() - тоже все ОК. Результат первого варианта зависит от того четная или нечетная вторая цифра после запятой. Что бы это значило?

  Ответить  
 
 автор: Силыч   (23.10.2007 в 15:40)   личное сообщение
 
 

?ccur(0.21499)
0.215

?Round(0.21499,2)
0.21

?Round(ccur(0.21499),2)
0.22

  Ответить  
 
 автор: osmor   (23.10.2007 в 15:47)   личное сообщение
 
 

обширное обсуждение этого вопроса осталось на старом форуме
http://hiprog.com/forum/read.php?id_forum=1&id_theme=1543&page=1

  Ответить  
 
 автор: grafin   (24.10.2007 в 11:50)   личное сообщение
 
 

Спасибо за ссылку, а то я слышал звон , но не помнил, откуда. Однако...
Берем рекомендованную
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
Однако....

  Ответить  
 
 автор: Анатолий (Киев)   (23.10.2007 в 16:27)   личное сообщение
 
 

Фокус в том, что 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(). Кстати этот принцип бухгалтерии тоже не понравится.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList