Почему центы для std :: put_money ()?

Мне интересно, почему функция std::put_money() принимает центы вместо долларов. Также рассматривая определение cppreference , он не говорит, что должен вводить номер быть.

Правда ли, что в любой валюте мы должны использовать десятичное число при минимально возможном десятичном значении этой валюты? (т. е. * 1.0, * 100.0 или * 1000.0 в зависимости от обстоятельств?) Потому что это, кажется, включает знание валюты, противоположной текущей локали ...

4 голоса | спросил Alexis Wilke 22 Maypm18 2018, 22:28:59

1 ответ


0
Общая идея состоит в том, что вы не хотите использовать плавающую точку с валютой, потому что значения с конечным числом десятичных цифр могут быть периодическими в двоичном формате, а учитывая, что значения с плавающей точкой имеют конечную точность, это приводит к неожиданностям при их суммировании;обычный примеркоторый печатает ---- +: = 1 =: + ---- .Простой подход к решению проблемы - использовать интегральные значения для «наименьших нефракционных единиц валюты» (спасибо @Justin за цитату);это гарантирует, что когда пользователь вводит $ 0,10, оно точно представлено и не приводит к неожиданности округления, по крайней мере, пока мы имеем дело со значениями, где ожидается точная точность.Это нормально и объясняет центы, но почему ---- +: = 2 =: + ----, а не какой-то целочисленный тип?Здесь я размышляю, но вижу две разумные мотивы:дробное количество валюты - это то, что существует, как правило, по унитарным ценам (например, цена за литр бензина);точность, как правило, не так важна - вы все равно умножите ее на другое значение с плавающей запятой - но вы хотите иметь возможность читать такие значения;но самое главное, исторически значения с плавающей запятой имели наилучшую точность по широкому спектру платформ, даже для интегральных значений.---- +: = 3 =: + ---- (гарантированно будет не менее 64 бит) является недавним дополнением к стандарту, и ---- +: = 4 =: + ---- обычно32-битная ширина: это ограничило бы денежную стоимость до скудных ~ 21 миллиона долларов.OTOH, даже обычный ---- +: = 5 =: + ---- на большинстве платформ имеет 53-значную мантиссу, что означает, что он может представлять ровно целые значения вплоть до 9007199254740991 - так, что-то вроде 90 тысяч миллиардов долларов;этого достаточно, чтобы точно представить государственный долг США в центах, так что, вероятно, достаточно точно для всего остального.Вероятно, они выбрали ---- +: = 6 =: + ---- ---- +: = 7 =: + ---- как «самый большой молот, который они могут бросить в проблему» (даже если в настоящее время этокак правило, такой же большой, как равнина ---- +: = 8 =: + ---- ).Потому что это, кажется, включает в себя знание валюты, противоположной текущей локали ...И да и нет;Я думаю, что идея состояла в том, что, пока вы используете соответствующие фасеты локали как для ввода, так и для вывода, вам просто не нужно заботиться - библиотека должна делать преобразования за вас, и вы просто работаете с числами, точная величина которыхне должно действительно иметь значение для вас.Это теория;но, как сказано в комментариях, языковые стандарты C и C ++ представляют собой плохо спроектированное программное обеспечение с чрезмерно сложной конструкцией, которая, тем не менее, не подходит для тестирования в реальных условиях.Честно говоря, я бы никогда не использовал этот материал "по-настоящему":Вы никогда не можете быть уверены в том, насколько обновлена ​​стандартная библиотека, насколько она сломана (у меня когда-то был VC ++, когда я не мог выполнить поиск по итальянским локализованным цифрам), если она действительно поддерживает валюты, которые вас интересуют.вам не нужно заботиться о том , что его идея «наименьшего без дробной единицы валюты» , если вам нужно поговорить с чем - либо , кроме текстового ввода - вывода в формате , ожидаемом в библиотеке - скажем, вы должны получить цену акциииз веб-службы или если у вас есть встроенные данные для объединения с пользовательским вводом;то же самое для сериализации в машиночитаемом формате;Вы не хотите подвергать себя капризам своей среды выполнения C и конфигурации ОС при хранении пользовательских данных, особенно если они должны обмениваться с другими приложениями, особенно если указанные приложения работают в другой среде выполнения C (это может дажебыть вашим собственным приложением, скомпилированным для другой операционной системы!) или другим языком.
ответил Matteo Italia 23 Mayam18 2018, 00:05:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132