Разобравшись с этим в реальных финансовых системах, я могу вам сказать, что вы, вероятно, хотите использовать число с точностью не менее 6 десятичных знаков (при условии, что в долларах США). Надеюсь, так как вы говорите о валютных ценностях, вы не выйдете из-под контроля. Существуют предложения по добавлению десятичных типов в C ++, но я не знаю ни одного, который бы там был.
Лучший нативный тип C ++ для использования здесь будет long double.
Проблема с другими подходами, которые просто используют int, заключается в том, что вам нужно хранить больше, чем просто ваши центы. Часто финансовые транзакции умножаются на нецелые значения, и это доставит вам неприятности, поскольку 100,25 долл. США, переведенные в 10025 * 0,000123523 (например, APR), вызовут проблемы. В конечном итоге вы окажетесь на земле с плавающей запятой, и конверсии обойдутся вам дорого.
Теперь проблема не возникает в самых простых ситуациях. Я приведу вам точный пример:
Учитывая несколько тысяч значений валюты, если вы умножите каждое на процент, а затем сложите их, у вас будет другое число, чем если бы вы умножили сумму на этот процент, если вы не сохраните достаточно десятичных знаков. Теперь это может работать в некоторых ситуациях, но вы часто довольно быстро получаете несколько пенсов. Исходя из моего общего опыта, я должен убедиться, что вы сохраняете точность до 6 знаков после запятой (убедитесь, что оставшаяся точность доступна для всей числовой части).
Также поймите, что не имеет значения, с каким типом вы храните его, если вы занимаетесь математикой менее точно. Если ваша математика выполняется на земле одинарной точности, то не имеет значения, храните ли вы ее с двойной точностью. Ваша точность будет соответствовать наименее точному расчету.
Теперь, с другой стороны, если вы не сделаете никаких других математических операций, кроме простого сложения или вычитания, а затем сохраните число, все будет в порядке, но как только появится что-то более сложное, чем это, у вас будут проблемы .