Стратегии десятичного округления в корпоративных приложениях

Ну, мне интересно, что такое округление десятичных знаков и их сохранение в БД.

Проблема такая:

Допустим, у нас есть заказчик и счет-фактура.

Счет-фактура имеет общую стоимость 100 495 долларов США (из-за некоторого процента скидки, который не является целым числом), но отображается как 100,50 долларов США (с округлением, только для печати в счете-фактуре). Он хранится в базе данных с ценой 100 495 долларов США, что означает, что когда клиент вносит депозит в размере 100,50 долларов США, на его счете будет дополнительно 0,005 доллара США. Если округлить, он будет отображаться как $ 0, но после нескольких счетов-фактур он будет продолжать накапливаться, что может показаться неправильным (хотя на самом деле это не так).

Что лучше делать в этом случае. Сохранить стоимость 100,50 долларов или оставить все как есть?


person Denis Biondic    schedule 24.03.2010    source источник
comment
Ой-ой! Радикс редактировать войны! Запятая! Нет, точка! Нет, запятая! Нет, точка! ...   -  person John    schedule 24.03.2010
comment
Готовитесь к атаке нарезки салями, а? en.wikipedia.org/wiki/Salami_slicing :-)   -  person Eric Lippert    schedule 25.03.2010
comment
Ты узнаешь что-то новое каждый день. : O   -  person Joan Venge    schedule 25.03.2010


Ответы (4)


Вы должны хранить номер именно так, как хотите, чтобы он отражался на их балансе.

Вы действительно берете с клиента полцента? Если да, это должно быть отражено в записи БД. Если нет, то не должно.

Но если бы я не публиковал начисленные проценты ежедневно (например, Prosper.com), я бы придерживался единиц валюты, которые люди могут платить (или снимать) точно.

person John    schedule 24.03.2010
comment
Нет, мы не берем эти полцента, потому что в счете указано 100,50 долларов, и это сумма, которую клиент вносит. Система используется почти исключительно для балансов клиентов, здесь нет балансовых отчетов, отчетов о движении денежных средств или чего-либо другого, сильно связанного с бухгалтерским учетом. Что вы предлагаете тогда округлить и так хранить? - person Denis Biondic; 24.03.2010
comment
В таком случае обязательно сохраните округленную сумму. Если покупатель покупает один, взимайте (и сохраняйте) 100,50 долларов (или 100,49 долларов, однако вы хотите округлить всю сумму). Если они купят два, зарядят и хранят 200,99 долларов. В вашем случае полцента не имеет значения после того, как заказ сделан, так что забудьте об этом. - person John; 24.03.2010
comment
Какими бы ни были ваши бизнес-правила, это то, что вам следует хранить. Если вы берете 100,50 долларов, а клиент заплатил 100,50 долларов, хранение 100 495 долларов бесполезно для всех участников. Точно так же, как если бы дошло до 100.3333333333, вы бы не хранили все тройки, ваши бизнес-правила сказали бы вам, как и когда их обрезать. - person Chris Haas; 24.03.2010

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

person AxelEckenberger    schedule 24.03.2010

Я бы сохранил оба (серьезно).

person ChristopheD    schedule 24.03.2010

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

person Klaus Byskov Pedersen    schedule 24.03.2010