Форум: "Основная";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];
ВнизПомогите с округлением Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c