При записи финансовых данных возникает много проблем с округлением.
Первая проблема - это возможность хранить и извлекать точные десятичные числа
- большинство баз данных предлагают тип данных десятичного разделителя, для которого можно указать количество цифр до и после десятичного разделителя (количество валют также различается по количеству десятичных знаков, я имел дело с валютами с 0, 2, 3 десятичными знаками)
- при работе с этими данными, и вы хотите избежать каких-либо непредвиденных ошибок округления на стороне приложения, вы можете использовать BCD в качестве универсального подхода, или вы можете использовать целые числа для представления любой фиксированной десятичной записи или смешивать свои собственные
Если эта первая проблема решена, то никакое добавление (или вычитание) не может привести к ошибкам округления. То же самое касается умножения на целое число.
Во второй проблеме, после того как вы сможете хранить и извлекать данные без потери информации, ожидаются ошибки округления из-за деления (или умножения на нецелое число).
Например, если формат вашей валюты допускает 2 десятичных знака, и вы хотите сохранить транзакцию, в которой записи балансируют дебет от 10 до 3 равных частей, вы можете сохранить его только как
10.00
-3.33
-3.33
-3.33
и
-0.01
(ошибка округления)
Это ожидаемая проблема, которая возникнет независимо от выбора типа хранилища данных, и о ней необходимо позаботиться, если вы хотите, чтобы ваши учетные записи находились на балансе. Эта ситуация в основном представлена делением (или умножением на нецелые числа, которые имеют много значащих цифр).
Один из способов справиться с этим - проверить, сбалансированы ли ваши данные после таких операций, и распознать допустимую разницу округления в отличие от ошибки.
EDIT:
Что касается ссылок на литературу, этот кажется интересным и не слишком длинным и касается довольно широкой аудитории с интересными сценариями.