Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

округление-потеря копейки [D7, XP]


Страницы:   1 2

dis12345 ©   (2014-05-04 20:16:00) 

Здравствуйте!
При вычислении стоимости, умножая количество=вес на цену, получаем значение. При передаче цены и количества в фискальный регистратор, получаем подитог, отличающийся от вычисленного в delphi на 1 копейку и чек не пробивается.

Пример:
procedure TForm1.Button1Click(Sender: TObject);
var
a,b : real;

begin

a:=0.211;
b:=105.00;

Label1.Caption:=FloattoStr(RoundTo(a*b,-2));
Label2.Caption:=FloattoStr(RoundTo(0.211*105.00,-2));

end;

0.211х105=22.155
получаем два различающихся итога: 22.15 и 22.16
итог в ФР= 22.16

есть ф-ия SetRoundMode, в ней параметрами настраивается способ округления. Какой из параметров
rmNearest Rounds to the closest value.
rmDown Rounds toward negative infinity.
rmUp Rounds toward positive infinity.
rmTruncate Truncates the value, rounding positive numbers down and negative numbers up.

гарантированно округлит 0,5 до 1   подскажите плиз


Cobalt   (2014-05-14 15:53:00) [1]

2 dis12345 ©   (04.05.14 20:16)
А у вас ФР сам формирует строку?
Если нет, то проще давать ему кол-во = 1, цена = округленная сумма


Inovet   (2014-05-12 17:16:00) [2]

> [31] Дмитрий   (12.05.14 15:57)
> Деньги нужно хранить в топорах

Такой случай описан у классика.


Дмитрий   (2014-05-12 15:57:00) [3]

Деньги нужно хранить в топорах, запчастях, продуктах и тыды...


Dennis I. Komarov   (2014-05-12 09:41:00) [4]


> деньги - всегда хранить в double

Деньги надо хранить в копейках :)


Inovet   (2014-05-12 03:44:00) [5]

> [28] megavoid ©   (12.05.14 02:28)
> деньги - всегда хранить в double

И что там нахранится? Просуммируй эти дабл и получишь ошибку.


megavoid   (2014-05-12 02:28:00) [6]

[3] и [10] - деньги - всегда хранить в double


Труп Васи Доброго   (2014-05-08 08:49:00) [7]


> Давно?

7 лет назад, при сверке начислений льготникам. А что, с тех пор что-то изменилось? Я так понял в банках это округление применяют, чтобы лишние округлённые деньги не накапливались. У меня таким образом на около 10000 льготниках примерно у 1 - 1,5 тысяч человек результат получался с *,5 коп. А это 1000*0,5коп=5 руб из воздуха. Ну я ,естественно, их в большую сторону округлял, как в школе учили. А при проведении платежей через банк итоговая ведомость отличалась на несколько рублей с копейками. Помню долго я тогда мозг об стену разбивал, копаясь где же ошибка в расчётах, а всё оказалось гораздо проще, при банковском округлении "лишние" добавленные 0,5 копейки на чётных числах компенсируются "отброшенными" 0,5 копейками на нечётных, и на большом количестве операций "накопление" стремится к нулю.


Inovet   (2014-05-08 08:06:00) [8]

> [25] brother ©   (08.05.14 05:38)

При округлениях 5 всегда в большую сторону, ошибка накопится больше, чем при округлениях 5 к чётному.


brother   (2014-05-08 05:38:00) [9]

[23] не понял

> чтобы ошибки округления при разгоне погрешности не накапливались

ведь 200 раз округлили в большую сторону и 10 раз в меньшую, накопили ведь погрешноть, или я не понял ка оно себя уравнивает всреднем...


Inovet   (2014-05-07 23:45:00) [10]

> [23] Dimka Maslov ©   (07.05.14 23:34)
> В геодезии

Вот в таких применениях при машинной обработке логичней бы было хранить в плавающей точке. Но если на бумаге ведётся обработка, в поле, например, так придётся учитывать.


Dimka Maslov   (2014-05-07 23:34:00) [11]


>
> Приведите факт в настоящем времени


В геодезии, например, когда идёт обработка съёмки округление идёт именно в сторону чётной цифры на конце десятичной дроби - чтобы ошибки округления при разгоне погрешности не накапливались


Inovet   (2014-05-07 23:11:00) [12]

> [21] Dennis I. Komarov ©   (07.05.14 22:47)

Да я откуда знаю. Где-нибудь да применяют, в банках, вероятно, если судить по названию. Я же говорю о том, что для денег стандартными пользоваться нельзя, хоть какое там (в тех местах) округление принято.


Dennis I. Komarov   (2014-05-07 22:47:00) [13]


> Inovet ©   (07.05.14 20:17) [20]
> > [19] Dennis I. Komarov ©   (07.05.14 19:40)
>
> Так применяют, чтобы статистическая ошибка не накапливалась.
>  А где как принято, надо смотреть. В любом случае стандартные
> функции Делфи будут давать неправильный результат в десятичной
> системе.

Приведите факт в настоящем времени


Inovet   (2014-05-07 20:17:00) [14]

> [19] Dennis I. Komarov ©   (07.05.14 19:40)

Так применяют, чтобы статистическая ошибка не накапливалась. А где как принято, надо смотреть. В любом случае стандартные функции Делфи будут давать неправильный результат в десятичной системе.


Dennis I. Komarov   (2014-05-07 19:40:00) [15]


> Труп Васи Доброго ©   (05.05.14 14:21) [16]


> antonn ©   (06.05.14 12:04) [18]

Давно?

P.S.
  Да я не против что как факт оно есть...


antonn   (2014-05-06 12:04:00) [16]


> Это откуда такие знания?

я подтверждаю :)
потому что тоже напарывались когда инкассация не сходилась на одну копейку как раз из-за акционных округлений. в конце концов должна же быть единая система округления


dis12345   (2014-05-05 15:12:00) [17]

Всем спасибо! и подсказали, и повеселили  :)


Труп Васи Доброго   (2014-05-05 14:21:00) [18]


> Это откуда такие знания?

Уже сталкивался, я раньше тоже только про математическое округление знал, пока не напоролся на расхождение в суммах при сверке с банком в несколько рублей. В итоге выяснилось, что на свете существует банковское округление, о котором я был не в курсе. Пришлось исправлять программу. Как то так.


Dennis I. Komarov   (2014-05-05 13:59:00) [19]


> 0.211х105=22.155
> получаем два различающихся итога: 22.15 и 22.16
> итог в ФР= 22.16

Далее div 1 - остаток проводим как скидка. Все довольны...


Dennis I. Komarov   (2014-05-05 13:53:00) [20]


> В банках и кассовых аппаратах используется банковское округление,
>  а не математическое. В банковском округлении округление
> происходит округление к ближайшему чётному, то есть 2,5
> → 2, 3,5 → 4.
> Соответственно в твоём случае 5,5 округляется до ближайшего
> чётного 6.
> Вот и вся хитрость.

Это откуда такие знания?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо