LINUX.ORG.RU

c++ gcc Qt - денежный тип данных


0

1

Существует ли денежный тип данных. Кто нибудь реализовывал класс денежного типа, что бы работать с ним как с float? Не охото заморачиваться с int64

реализовал тип данных QCurrency. Кто поопытнее может проверить на быдлокодство? http://rghost.ru/36989873

★★★

Последнее исправление: pozitiffcat (всего исправлений: 1)
Ответ на: комментарий от Chaser_Andrey

например подсчет денег

float sum = 0;//с доубле получше но теряются копейки
    for(int i=0;i<1000;i++)
        sum += 95.33f;
        out<< QString::number( sum.toDouble(),'f',4)<<endl;//выдаст 9528 чето там, куда делись 5 руб? Вот для этого и нужен денежный тип

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

Ты какую-то хрень сделал.

#include <QtCore>

int main()
{
        double sum = 0;
        for(int i=0;i<1000;i++)
                sum += 95.33f;
        qDebug("%s", qPrintable(QString::number( sum,'f',4)));
}
chaser@chaser-work /tmp/test $ ./test 
95330.0018
Chaser_Andrey ★★★★★
()
Ответ на: комментарий от pozitiffcat

Не охото заморачиваться с int64

ну и какие же заморочки, например? храни все суммы копейками в int

anonymous
()

А почему бы просто не хранить всё в копейках? А при выводе переводить в человеческий формат.

Kalashnikov ★★★
()

Это нужно было сделать на Haskell. Обязательно введя проверку тайпчекером на используемую валюту. И с функциями конверсии из одной в другую. Инстанцируя тайпкласс Num

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

дада, я там с исходником химичил, и выложил сюда пример идиотский. Ты сам проверял? например не на 1000 а на 1000000 итераций. Сразу поплывут рубли копейки, это не есть хорошо. Одна копейка лишняя или недостающая выливается мне в кучу проблем

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

Ну так а что ты хочешь от float/double?

Тогда да, храни сумму в копейках. Вот только что будет, если пройдет итерация пару сотен раз, где эти копейки округлятся?

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

А размеры файлов в байтах тоже костыльно?

Сделай тупо

class Money {
    int roubles, kopecks;
    // какая-нибудь функция которая пересчитывает 100 копеек и тривиальные арифметичкие операторы
}

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

что там что там погрешности. Больше поражает, что не придумали еще тип данных деньги. Где можно производить операции с дробными суммами

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

я сделал тупо long long где double *= 100 - но ИМХО это костыль, хотя я думаю это единственный вариант

pozitiffcat ★★★
() автор топика

А чего его реализовывать-то?.. Отдельно int для копеек, отдельно для рублей. Для копеек можно и short или char использовать (или что там самое маленькое).

Реализуешь в виде класса... перегрузка операторов в плюсах есть - перегружаешь сложение, вычитание, умножение, и т.п..

Самое главное чтобы мозгов хватило для этой цели не использовать float/double - потери точности гарантированы.

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

Вот только что будет, если пройдет итерация пару сотен раз, где эти копейки округлятся?

Инфляция скоро устранит проблему округления копеек. А там, глядишь, и дробные части рублей исчезнут.

DeVliegendeHollander ★★
()

А зачем тут qt, кстати?... оно тут по-моему никоим боком. %)

Скачивать с файлообменника код лень... осильте уже wgetpaste

BattleCoder ★★★★★
()

Когда писал ПО для работы с деньгами, в итоге был вынужден добавить округление итогов для отчетов. А вообще стоит узнать как хранятся и обрабатываются денежные величины в столь любимом бухгалтерами 1С.

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

просто я на Qt делаю прогу, а этот код кусок теста

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

А зачем тут qt, кстати?.

Насколько я понял, на Qt будет сам интерфейс, а сейчас тут обычный с++. По сабжу, как уже предлагали


class Money
{
 int rubli, kopeyki;
...
}

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

Понятно. Ну привязывать реализацию «денег» к кутям нет никакого смысла... тут одного простенького класса хватит. Смотрите, как это в питоне (или в жабе) реализовано. тип decimal, по-моему.

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

Угу, и я о том же. Где тут костыль - не знаю =) Почему в плюсах уже нет такого класса - в принципе объяснимо... потому что до хрена библиотек (STL, boost, Qt,...), но нет той, которая так или иначе является именно стандартом...

кстати, можете в бусте поискать... вдруг что и есть. Но мне кажется, быстрее и проще самому написать ;) в бусте копаться занятие не для слабонервных, помню, возился с генераторами случайных чисел я там...

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

да впринципе я сделал, но вот не пойму кое чего: как описать переопределение для такого вида:

double a = 2.00;
QCurrency money = 5.60;
QCurrency skid = a * money;//money * a работает, а так нет

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

хотя это наверное не возможно, ни где не видел чтобы например к string строке можно было присобачить строку QString оператором плюс, только наоборот

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

Ошибка

C:\Qt\qtcreator-2.4.1\currency-test-build-desktop-Qt_4_6_4__4_6_4_________\..\currency-test\qcurrency.h:14: ошибка: 'QCurrency QCurrency::operator*(double, const QCurrency&)' must take either zero or one argument
я уже пытался так сделать

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

когдато в Delphi юзал этот тип, запомнилось

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

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

В том числе оператор присваивания и ещё какой-то... какой вам нужен. Может, в качестве примера какой-нить автор какой-то книжки как раз и захочет реализовать «денежный» тип =)

BattleCoder ★★★★★
()

Представь свои деньги как целое число копеек произвольной длинны. Всё равно любое другое представление нужно только при отображении. За целым произвольной длинны иди в libgmp.

KblCb ★★★★★
()
Ответ на: комментарий от pozitiffcat
struct test{
 test operator *(int){return test();}
};

test operator*(int,test const&){return test();}

int main(int argc, char *argv[]){
 test t;
 t*1;
 1*t;
 return 0;}

Дальше сам.

staseg ★★★★★
()

Почему-то я почти уверен, что человеческим вариантом реализации как раз является хранение суммы в копейках и форматирование данных на выводе. Вот для форматирования можно запилить класс, да (саму сумму внутри хранить, естественно, как раз в копейках, ибо теперь подумайте каково будет, предположим, перевести N рублей M копеек в Гамбийский Даласи или Нидерландский Евро, когда сумма будет храниться отдельно (зачем? sic!) в копейках / рублях, а не просто копейках).

Insomnium ★★★★
()

А в копейках всё считать не проще?

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

Кажется оператор приведения типа надо перегрузить.

Когда кажется, креститься надо, а не на ЛОРе херню писать

anonymous
()

Единственный разумный формат работы с деньгами — формат с фиксированной запятой. Самый простой вариант — считать в копейках. Более продвинутый вариант — с хранением числа знаков после запятой.

За использование формата с плавающей запятой, немедля сжигать током низкого напряжения. В назидание потомкам.

За использование типов с фиксированной длинной — нещадно бить. Особенно, это касается использования «аппаратных» типов навроде int.

За использование БЕЗзнаковых типов — делать серьезные внушения. Да, деньги могут быть отрицательными ;). Для сомневающихся курить термин «красное сальдо».

ЗЫ: Например, в межбанковком электронном обмене деньги ходят в копейках ;).

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

QCurrency skid = a * money;//money * a работает, а так нет

money * a - это QCurrency::operator* (double). Ну или operator* (QCurrency, double). Видимо, один из них ты перегрузил (скорее всего первый).

Чтобы иметь возможность писать a * money, надо так же перегрузить operator* (double, QCurrency).

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

invy

[...]mod и div


Insomnium

[...]форматирование данных на выводе


Я бы реализовал это именно через mod и div, я только не понял к чему вообще вы это сказали.

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