Главная страница
    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-44370
Scotch
2003-03-25 23:25
2003.04.14
Вопрос по хостингу


3-44030
Zest
2003-03-22 20:29
2003.04.14
Почему для поля varchar(256) задается тип TMemoField?


14-44366
Rand
2003-03-25 13:24
2003.04.14
Универсальный SMTP


1-44237
Serega
2003-04-02 10:30
2003.04.14
Как извлечь avi--файл из ресурса


7-44480
mmmh
2003-02-17 22:17
2003.04.14
Как свернуть все окна. Помню Что надо посылать месагу minimaze то





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский