Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Большие числа в C#


Автор: MRC 30.11.2009, 17:30
Точность числовых данных (значащие цифры числа):   5 цифр для типов float и double, 15 цифр для типа decimal. Есть страны, где буханка хлеба стоит сотни тысяч денежных единиц. Представим себе, что надо написать в такой стране банковскую программу, использующую такие большие числа (для банка это уже будут сотни и тысячи триллионов). 

Как можно это сделать при таком малом числе значащих цифр? 
Или я что-то не то спрашиваю?...

Автор: Дрон 30.11.2009, 18:18
Цитата(MRC @  30.11.2009,  17:30 Найти цитируемый пост)
 5 цифр для типов float и double, 15 цифр для типа decimal

Это не так. Я бы сказал скорее 7 цифр для float, 15 для double и 28 для decimal.

Цитата(MRC @  30.11.2009,  17:30 Найти цитируемый пост)
сотни и тысячи триллионов

По MSDN наибольшее число, представимое в decimal:
79,228,162,514,264,337,593,543,950,335
Это 79 триллионов умноженных на триллиард. Должно хватить даже для Зимбабве smile

Автор: MRC 30.11.2009, 18:47
Хорошо.
Что делать, если число всё же выходит за рамки типа double, а нам к этому числу ой как надо применить несколько функций из математической библиотеки ?  Тип decimal здесь не подходит. Как специалисты выходят из такого положения ?

Автор: Heinzz 30.11.2009, 18:49
ИМХО они туда не заходят, не стоит доводить до такого, все числа должны быть сопоставимы

Автор: GavriKos 30.11.2009, 18:50
Может конечно фигню скажу, но я бы просот передвинул запятую в числе до всех мат.операций (в процессе считывания, когда число  еще строка), а потом обратно запятую...

Автор: Heinzz 30.11.2009, 19:18
точность все равно будет утеряна, тк число запоминаемых цифр где бы не стояла запятая не изменится.

зы Сталкивался с подобной проблемой при написании программы вычисления конечными элементами, решение наиболее верное => менять подход в расчетах, дифуры "причесать" smile 

Автор: GavriKos 30.11.2009, 19:45
Ну у человека я думаю абстрактный вопрос ))) Вообще можно рискнуть в таком случае писать свой класс, нуружу который выпускает число в строке (и принимает тоже), внутри себя же разбивает его на подчисла (пускай по 12 знаков, допустим), и перегрузить ему сложение, вычитание и прочее. Для него же перегрузить и все другие мат. функции, которые нужны. боюсь что с синусами и проч. буду проблемы, но элементарные сложение-вычитание реализовать можно. По идее для банка хватит ;-)

Автор: Ctrl 30.11.2009, 19:53
Вообще, для подобных задач давно уже придуман EA-паттерн "Money".
А уж при его реализации вполне можно все эти тонкости учесть (например хранить отдельно целую часть, ее десятичный порядокб дробную часть).

Вот навскидку пример реализации - http://www.codeplex.com/MoneyType

Автор: Heinzz 30.11.2009, 21:53
Цитата(GavriKos @  30.11.2009,  19:45 Найти цитируемый пост)
 Вообще можно рискнуть в таком случае писать свой класс, нуружу который выпускает число в строке 

это конечно вариант, но я не об этом, а о том "стоит ли?"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)