LINUX.ORG.RU

Currency class for C++


0

0

Нужен класс для представления денег (рубли) в C++. Уже начал писать свой, но может есть что-то готовое и универсальное, чтобы не переизобретать велосипед?

Нужно следующее:
1) Внутри только целочисленная арифметика (т.е. fixed point).
2) При всех операциях проверка на overflow/underflow. В принципе больших сумм не планируется, но хочется чтобы класс выкидывал при этом исключения, а не считал втихую неправильно.
3) Преобразование в/из строк, в том числе поддержка iostream'ов.
4) Ну и основные операции: сложение, вычитание, расчёт процентов и т.п.

Кто что посоветует, если есть готовое?

Deleted

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

mint
()

>> Кто что посоветует, если есть готовое?

Такие задачки интересно решать на скорость - кто быстрее напишет ;))

cathode
()
Ответ на: комментарий от cathode

>> Такие задачки интересно решать на скорость - кто быстрее напишет ;))

Ага, и смотреть кто при этом наделал меньше ляпов, типа не увидели возможность переполнения или потери точности 8).

Deleted
()

а разве денюжки не положено считать до четвертого знака после запятой?

z0D5e8n7x
()
Ответ на: комментарий от YesSSS

>> AFAIK double - 15 знаков точности, не хватит?

Во-во-во, вот так и начинаются кризисы :) Хто-ж даблами деньги считает? Ошибки округления куда девать?

cathode
()
Ответ на: комментарий от cathode

> Во-во-во, вот так и начинаются кризисы :) Хто-ж даблами деньги считает? Ошибки округления куда девать?

На балансовый субсчет который закреплен за каждым счетом для накопления остатков округления. Никогда не задавался вопросом почему в табулеграмме фигурирует надпись "Долг за предприятием 0.03 рубля" ?

А по сабжу - еще рекомендую нарисовать классы-потомки типа "копейко" "рубель" "заначко" "натуроплата"... ага...

iBliss
()
Ответ на: комментарий от YesSSS

> AFAIK double - 15 знаков точности, не хватит?

Вы сказали глупость, деньги всегда считаются в целых.

anonymous
()
Ответ на: комментарий от generatorglukoff

>> умножить на 100 и использовать long long - это верх фантастики? О_О

Так и нужно делать ИМХО.

Deleted
()
Ответ на: комментарий от iBliss

>> На балансовый субсчет который закреплен за каждым счетом для накопления остатков округления. Никогда не задавался вопросом почему в табулеграмме фигурирует надпись "Долг за предприятием 0.03 рубля" ?

И что? Внутреннее представление все равно остается целочисленным, в копейках. Иначе у тебя дебет с кредитом ваааще никогда не сойдется, ага.

cathode
()
Ответ на: комментарий от cathode

> И что? Внутреннее представление все равно остается целочисленным, в копейках. Иначе у тебя дебет с кредитом ваааще никогда не сойдется, ага.

Дебет с кредитом не сойдутся без вот таких вот счетов, а кто как хранит - кто в целых, кто тупо множит на сто, разницы нет.

iBliss
()
Ответ на: комментарий от iBliss

>> Дебет с кредитом не сойдутся без вот таких вот счетов, а кто как хранит - кто в целых, кто тупо множит на сто, разницы нет.

В догонку....

Никогда не задумывался, почему у интела 1 - 0.9 = 0.099999999999999978, а не 0.1? Ты это тоже по счетам остатков округления будешь учитывать?

cathode
()
Ответ на: комментарий от cathode

> Никогда не задумывался, почему у интела 1 - 0.9 = 0.099999999999999978

Кроме шуток для меня это новость. Что за тип и какая среда ?

iBliss
()
Ответ на: комментарий от iBliss

>> Что за тип и какая среда ?

Тип float. Среда конкретно в этом случае python, проц Xeon. Такая неточность будет в любой среде и на любых процах, потому что десятичные числа в общем случае нельзя точно представлять в двоичной системе. Плюс разные процы используют разную логику работы при операциях с плавающей точкой (например, перед вычислением преобразуют числа в double, а потом назад во float).

cathode
()
Ответ на: комментарий от cathode

После

> Среда конкретно в этом случае python,

Проц значения не имеет. А вот при кривом определении типов в SDK и непонятках со знаковым битом такое может быть дааа где угодно

Так что рекомендации учить трансляцию между сс - это скорее к Гвидо...

iBliss
()
Ответ на: комментарий от iBliss

>#include <stdio.h> > >int main(void) { float a=1,b=0.9; printf("%f\n",(a-b)); } > >результ > >satellite:~ iblis$ ./a.out 0.100000 > >И всегда так было.

Почитай хоть здесь что-ли http://en.wikipedia.org/wiki/IEEE_754-1985, прежде чем пороть чушь.

anonymous
()
Ответ на: комментарий от iBliss

>> #include <stdio.h>
>> int main(void) { float a=1,b=0.9; printf("%f\n",(a-b)); }

>> результ

>> satellite:~ iblis$ ./a.out 0.100000


А ты выводи с большей точностью:

ivan@localhost ~ $ cat test.c
#include <stdio.h>

int main(void) { float a=1,b=0.9; printf("%.20f\n",(a-b)); }
ivan@localhost ~ $ ./a.out
0.10000002384185791016

В принципе, если нужно проделать один раз какие-то несложные вычисления и тут же выдать результат, то float/double вполне можно использовать. Но мне нужно добавлять данные за каждую неделю, причём результат вычислений за следующую неделю зависит от предидущей. В случае с floating point у меня со временем накапливалась бы погрешность и под конец ВНЕЗАПНО где-нибудь вылезла бы лишняя копейка и у бухгалтеров не сошёлся бы отчёт. Тут есть два варианта решения проблемы:

1) На каждом шаге каким-нибудь способом бороться с накоплением ошибки в числах с плавающей точкой
2) Использовать числа с фиксированной точкой, т.е. хранить количество копеек (или сотых долей копеек, если нужна высокая точность)

Второй способ ИМХО проще и менее костыльный.

Deleted
()
Ответ на: комментарий от Deleted

3) Использовать рациональные числа (т.е. хранить пару целых чисел).

Legioner ★★★★★
()
Ответ на: комментарий от cathode

Мое замечание было к тому, что если человек не считает буджеты государств, то ему такая точность врядли когда понадобится (при правильных алгоритмах), если считает - то странно задавать такие вопросы на ЛОРе. =)

P.S. Если нужно выпендриться - бери реализацию на стрингах.

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

>> Мое замечание было к тому, что если человек не считает буджеты государств, то ему такая точность врядли когда понадобится (при правильных алгоритмах), если считает - то странно задавать такие вопросы на ЛОРе. =)

Может поделитесь этими "правильными алгоритмами"?

Deleted
()
Ответ на: комментарий от Deleted

Тогда и задачами неплохо-бы поделиться. =)

Мой посто про алгоритмы о том, что для одних и тех-же задач есть как более стойкие к ошибкам алгоритмы, так и менее. И что в тех-же даблах весьма можно считать если для твоей задачи есть вменяемые устойчивые алгоритмы.

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

Вы хоть понимаете что вы глупости пишете? Все финансовые расчеты используют целочисленные типы, если это не так -- код говно. И нету тут никаких но и если. Так же как для индексации массивов используются только целые числа.

anonymous
()
Ответ на: комментарий от iBliss

>> Проц значения не имеет

Конкретно в случае денег - нет, т.к. целочисленные вычисления везде одинаково проходят. А вот числа с плавающей точкой каждый проц обрабатывает по разному.

>> А вот при кривом определении типов в SDK и непонятках со знаковым битом такое может быть дааа где угодно

Типы int, float. double, long определены не в SDK, а как ни странно стандартами и, соответсвенно, микрокодами проца. В питоне типы преобразуются 1 в 1 в сишные флоаты, даблы и проч.

>> Так что рекомендации учить трансляцию между сс - это скорее к Гвидо...

Рекоммендации к тебе подучить матчасть.

cathode
()
Ответ на: комментарий от anonymous

>> Вы хоть понимаете что вы глупости пишете?

Как говорится, главное не результат, а процесс. :)))

cathode
()
Ответ на: комментарий от iBliss

> iBliss

Странное ты себе прозвище выбрал. Особенно с учетом вязи на картинке.

eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.