Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.14;
Скачать: CL | DM;

Вниз

Помогите с округлением   Найти похожие ветки 

 
phantom2040 ©   (2003-04-03 10:39) [0]

Привет Мастера!!!
Проблема такая, в программе нужно округлять число до 2 знаков после запятой, использую функцию RoundTo, но мне нужно сделать округление на манер кассовых аппаратов, дело в том, что на сколько я помню из математики 1, 275 = 1,27 а 1,276 = 1,28 так же и действует RoundTo, но кассовый аппарат округляет 1,275 = 1,28, помогите решить эту проблему, надо сделать округление на манер кассового аппарата


 
Style   (2003-04-03 10:40) [1]

function FlRound(Fl: double; M: Integer): double;
var
d : double;
begin
d := intpower(10,M);
if(Fl>0) then
result := Round(fl * d + 0.5) / d else
result := Round(fl * d - 0.5) / d;
end;


 
Style   (2003-04-03 10:45) [2]

Тебе наверное нужно вот так :)
result := Round(fl * d - 0.5) / d else
result := Round(fl * d + 0.5) / d;


 
[diesel]   (2003-04-03 10:46) [3]

result:=strtofloat(formatfloat("#"+decimalseparator+"00",source))

через **пу ;)


 
Anatoly Podgoretsky ©   (2003-04-03 10:49) [4]

Есть разные методы округления 0.5, тот который ты описал это округление до нечетного, очень редко использувется, в основном используется до четного. Есть округление в большую сторону.
Какой конкретно использует метод твой кассовый аппарат не понятно, поскольку ты привел очень мало исходных данных, проверь на следующих числах 1,265 1,275 1,285
Кроме того учти, что большинство кассовых аппаратов работают с фиксированной запятой, а у тебя с плавующей, можешь получать неожиданные результаты. И тут тебе ничего не поможет большинство чисел нельзя представить точно в формате с плавающей запятой. Вызод в переходе на фиксированную. Есть тип Currency.


 
phantom2040 ©   (2003-04-03 13:24) [5]

Значит выспросил у бухгалтера как должно быть округление в кассовом, так вот число 1,244444445 будет округлено до 1,24,а число 1,24544445 будет округлено до 1,25, на сколько я понял в денежных расчетах актуальны только 3 знака после запятой остальные какие они бы там не были просто отбрасываются и исходя из этого набросал функцияю:
function KasRound(Fl: double; M: Integer): double;
var
d,s : double;
begin
d := intpower(10,M);
s:=Frac(fl * d);
if s >=0.5 then begin
result := ceil(fl * d) / d;
end else begin
result := floor(fl* d) / d ;
end;
end;
по идее M должна быть константа = 2, но в принципе и так работает, и функция округляет только до 2 знаков но так ка это делает кассовый, какие ваши соображения по этому поводу


 
dolmat ©   (2003-04-03 13:54) [6]

а так не пробовали
round(1,275*100)/100


 
phantom2040 ©   (2003-04-03 14:09) [7]

значит по предыдущему
if s >0.49 then begin
так будет правильней

dolmat © (03.04.03 13:54)
а так не пробовали
round(1,275*100)/100


хорошо а попробуй прогони через этот код число 1,325 скока на выходе получишь? ---- 1,32 а нужно 1,33..............


 
Anatoly Podgoretsky ©   (2003-04-03 14:14) [8]

Почему нужно? Некоторым нужно 1.32
Те примеры, которые ты испробовал у бухгалтера не отражают сути проблемы, а я тебе специально привел нужный ряд, вот на нем и надо было консультироваться с бухгалтером.

1,265 -> 1,26 | 1,27
1,275 -> 1,28 | 1,28
1,285 -> 1,28 | 1,29


 
phantom2040 ©   (2003-04-03 14:34) [9]

Значит суть всей проблемы, допустим я просчитываю сумму за услуги факса после расчета допустим выхожу на сумму 26,5 руб дальше накручиваю на сумму 5% налог с продаж = 1,325 кассовый округляет к 1,33, программа 1,32 теряется 1 копейка, в итоге рвет на 1 копейку за что бухгалтерия три шкуры сдирает, поскольку в чеке одна сумма в квитанции другая.
а это ряд можно дополнить
1,205 -> 1,2 | 1.21
1,215 -> 1.22| 1.22
1,225 -> 1.22| 1.23
1,235 -> 1.24| 1.24
1,245 -> 1.24| 1.25
1,255 -> 1.26| 1.26
1,265 -> 1,26| 1,27
1,275 -> 1,28| 1,28
1,285 -> 1,28| 1,29
еть какая -то закономерность



 
Silver_   (2003-04-03 14:56) [10]

попробуй RoundTo(a+0.001)
1.274 = 1.275 -> 1.27
1.275 = 1.276 -> 1.28

1.279 = 1.28 -> 1.28
1.280 = 1.281 -> 1.28

думаю то что надо :))


 
Спрашивающий   (2003-04-04 03:34) [11]

Не спотыкнись об это:
1.994-1.99
1.995-2



Страницы: 1 вся ветка

Текущий архив: 2003.04.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-44142
Spartak
2003-04-03 14:09
2003.04.14
Срочно ! как сделать messagebox в несколько строк ?


3-44068
Инна
2003-03-24 17:11
2003.04.14
модификация записей и отражение изменений на экране


1-44139
OlkaGTS
2003-04-01 17:39
2003.04.14
Редактор компонента


14-44408
FLIZ
2003-03-28 15:21
2003.04.14
Как определить длину RTF текста? (+)


14-44452
kostya2000
2003-03-25 20:01
2003.04.14
Люди, загадка: