Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-44353
Карлосон
2003-03-30 23:17
2003.04.14
Hello Programist А можно ли перевести Дату в числовой тип данных


14-44404
Дмитрий К.К.
2003-03-28 13:16
2003.04.14
Именинники 28 марта


4-44519
Delphi5.01
2003-02-14 21:15
2003.04.14
Спомощью какого компонента можно выводить текст ...


3-44011
Minivan
2003-03-25 08:13
2003.04.14
базы данных


14-44355
MVova
2003-03-31 10:40
2003.04.14
А почему здесь нет подсчета просмотров вопроса?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский