TL; DR 1 Что такое точный и поддерживаемый подход для представления валюты или денег в C?
Предыстория вопроса:
На это ответили для ряда других языков, но я не смог найти надежный ответ для языка C.
-
С# Какой тип данных я должен использовать для представления денег на С#?
-
Java Почему бы не использовать Double или Float для представления валюты?
-
Objective-C Как представить деньги в Objective-C/iOS?
Примечание: для других языков существует много похожих вопросов, я просто вытащил несколько для репрезентативных целей.
Все эти вопросы можно отделить до "использования типа данных decimal
", где конкретный тип может варьироваться в зависимости от языка.
Существует связанный с этим вопрос который в конечном итоге предлагает использовать подход с фиксированной точкой, но ни один из ответов не использует конкретный тип данных в C.
Аналогично, я просмотрел библиотеки с произвольной точностью, такие как GMP, но мне это не ясно, если это лучший подход использовать или нет.
Упрощение предположений:
-
Предположите архитектуру на основе x86 или x64, но, пожалуйста, обращайтесь к любым предположениям, которые повлияют на архитектуру на основе RISC, такую как чип Power или чип Arm.
-
Точность в расчетах является основным требованием. Простота обслуживания будет следующим требованием. Скорость расчетов важна, но третична по отношению к другим требованиям.
-
Расчеты должны быть в состоянии безопасно поддерживать операции с точностью до mill, а также поддерживать значения, вплоть до триллионы (10 ^ 9)
Отличия от других вопросов:
Как отмечалось выше, этот тип вопроса задавался ранее для нескольких других языков. Этот вопрос отличается от других вопросов по нескольким причинам.
Использование принятого ответа от Почему бы не использовать Double или Float для представления валюты?, выделите различия.
(Решение 1) Решение, которое работает практически на любом языке, это использовать целые числа и подсчитать центы. Например, 1025 будет $10,25. На нескольких языках также есть встроенные типы для работы с деньгами. ( Решение 2). Среди прочего, Java имеет класс BigDecimal, а С# имеет десятичный тип.
Акцент добавлен, чтобы выделить два предложенных решения
Первое решение по существу является вариантом подхода с фиксированной точкой. Существует проблема с этим решением в том, что предлагаемый диапазон (отслеживание центов) недостаточен для расчетов на основе мельниц, и значительная информация будет потеряна при округлении.
Другим решением является использование собственного класса decimal
, который недоступен в C.
Аналогично, ответ не рассматривает другие варианты, такие как создание структуры для обработки этих вычислений или использование произвольной библиотеки точности. Это понятные различия, поскольку у Java нет структур и почему следует рассматривать стороннюю библиотеку, когда в языке есть встроенная поддержка.
Этот вопрос отличается от этого вопроса и других связанных вопросов, потому что C не имеет одного уровня поддержки родного типа и имеет языковые функции, которых нет на других языках. И я не видел, чтобы какие-либо другие вопросы касались нескольких способов, с которыми это можно было бы приблизить в C.
Вопрос:
По моим исследованиям, кажется, что float
не является подходящим типом данных, который будет использоваться для представления валюты в программе C из-за ошибки с плавающей запятой.
Что я должен использовать для представления денег на C, и почему этот подход лучше, чем другие подходы?
1 Этот вопрос начался в более короткой форме, но полученная обратная связь указала на необходимость уточнения вопроса.