Математические операции с использованием System.Decimal в С#
Мне нужно уметь использовать стандартные математические функции для десятичных чисел. Точность очень важна. double
не является приемлемой заменой. Как математические операции могут быть реализованы с десятичными числами в С#?
редактировать Я использую System.Decimal
. Моя проблема в том, что System.Math
не работает с System.Decimal
. Например, следующие функции не работают с System.Decimal
:
- System.Math.Pow
- System.Math.Log
- System.Math.Sqrt
Ответы
Ответ 1
Ну, Double использует с плавающей запятой math это не то, что вам нужно, если вы не делаете тригонометрию для 3D-графики или чего-то еще.
Если вам нужны простые математические операции, такие как деление, вы должны использовать System.Decimal.
Из MSDN: Ключевое слово decimal обозначает 128-битный тип данных. По сравнению с типами с плавающей запятой десятичный тип имеет большую точность и меньший диапазон, что делает его пригодным для финансовых и денежных расчетов.
Обновление: После некоторого обсуждения проблема заключается в том, что вы хотите работать с Decimals, но System.Math принимает только двойные пакеты для нескольких ключевых функциональных возможностей. К сожалению, вы работаете с высокоточными числами, а так как Decimal - 128 бит, а Double - всего 64, преобразование приводит к потере точности.
По-видимому, есть некоторые возможные планы сделать большую часть System.Math дескриптором Decimal, но мы еще не готовы.
Я немного поработал для математических библиотек, и наконец нашел найденный теперь вопрос StackOverflow, где TheVillageIdiot упомянул следующие библиотеки:
1) Mathdotnet, математическая библиотека с открытым исходным кодом (MIT/X11, LGPL и GPL), написанная на С#/. Net, направленной на обеспечение самодостаточной рамки для символических алгебраических и численных/научных вычислений.
2) IMSL ™ С# Численная библиотека для приложений Microsoft®.NET (оплачивается)
3) Библиотека математики экстремальной оптимизации для .NET
Ответ 2
Вы не дали нам достаточно информации, чтобы ответить на вопрос.
десятичные и двойные значения являются неточными. Ошибка представления десятичных знаков равна нулю, когда представленная величина в точности равна доле формы (x/10 n) для подходящего выбора x и n. Ошибка представления удвоений равна нулю, когда величина точно равна доле формы (x/2 n) снова для подходящего выбора x и n.
Если величины, с которыми вы имеете дело, не являются долями этой формы, тогда вы получите некоторую ошибку представления, период. В частности, вы упомянули о квадратных корнях. Многие квадратные корни - иррациональные числа; они не имеют дробной формы, поэтому любой формат представления, который использует фракции, будет давать небольшие ошибки.
Можете ли вы объяснить, что вы делаете, более подробно?
Ответ 3
DecimalMath содержит все функции класса System.Math
с аналогией аргументов decimal
Примечание: это моя библиотека, а также содержит некоторые примеры в ней
Ответ 4
Используйте десятичный тип данных, который имеет 128 бит точности:
http://msdn.microsoft.com/en-us/library/364x0z75(v=vs.80).aspx