Mathematische Operationen mit System.Decimal in C#
Ich müssen zu können, verwenden Sie die standard-Mathematik-Funktionen auf Dezimalzahlen. Genauigkeit ist sehr wichtig. double
ist kein akzeptabler Ersatz. Wie können mathematische Operationen realisiert werden mit dezimal-zahlen in C#?
Bearbeiten
Ich bin mit der System.Decimal
. Mein Problem ist, dass System.Math
funktioniert nicht mit System.Decimal
. Zum Beispiel, die folgenden Funktionen arbeiten nicht mit System.Decimal
:
- System.Math.Pow
- System.Math.Melden Sie
- System.Math.Sqrt
- Können Sie definieren den standard-math-Funktionen?
- Was ist mit decimal-Typ?
- Die math-Funktionen werden Sie Verwendung, Pflege zu gönnen? Wir reden Floor und Ceil? Oder etwas anderes?
- Was ist ein 'Dezimalzahl', Ihrer Meinung nach?
- Welche Funktionen im besonderen? Können Sie Liste ein paar? Auch ist Decimal nicht einen geeigneten Datentyp?
- Die Frage ist sehr vage. Was müssen Sie wissen?
- Es sollte darauf hingewiesen werden, dass, solange Sie beschränken Sie die Werte, die Sie verwenden, um nur zahlen, die
double
geben Sie Ihnen einen wirksamen 53-bit-Ganzzahl. Haben Sie immer noch tun Sie Ihre eigenen fractional scaling, natürlich. - Vielleicht möchten Sie einen Blick auf dieses floating-point-gui.de/basic
- Ich bearbeitet meine post spiegeln die drei spezifischen System.Math-Funktionen, die notwendig sind.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, Doppel verwendet floating point Mathematik-das ist nicht, was Sie suchen, es sei denn, du tust Trigonometrie für 3D-Grafik oder so etwas.
Wenn Sie brauchen, um einfache mathematische Operationen wie division, sollten Sie System.Dezimal.
Aus der MSDN-Website: Die dezimal-keyword bezeichnet einen 128-bit-Datentyp. Im Vergleich zu floating-point-Typen, die decimal-Typ hat eine höhere Genauigkeit und einen kleineren Bereich, die macht es geeignet für den finanziellen und monetären Berechnungen.
Update: Nach einiger Diskussion, das problem ist, dass Sie wollen, um die Arbeit mit Dezimalzahlen, sondern System.Mathe dauert nur Verdoppelt für mehrere wichtige Stücke von Funktionalität. Leider arbeiten Sie mit hoher Präzision zahlen, und da Decimal 128 bit und Double ist nur 64, die Umwandlung führt zu einem Verlust an Präzision.
Scheinbar gibt es einige mögliche Pläne zu machen, die meisten des Systems.Mathematik handle Decimal, aber wir sind noch nicht da.
Habe ich gegoogelt um ein bisschen für die Mathematik-Bibliotheken und schließlich fand ich die nun gelöscht StackOverflow-Frage, wo TheVillageIdiot erwähnt die folgenden Bibliotheken:
1) Mathdotnet, Eine mathematische open-source (MIT - /X11 -, LGPL & GPL) - Bibliothek geschrieben in C#/.Net, mit dem Ziel, bieten eine in sich geschlossene sauberen Rahmen für symbolische algebraische und numerische /wissenschaftliche Berechnungen.
2) IMSL™ C# - Numerische Bibliothek für Microsoft® .NET-Anwendungen (Bezahlt)
3) Extreme Optimierung Mathematik-Bibliothek für .NET
Haben Sie noch nicht die uns fast genug Informationen, um die Frage zu beantworten.
decimal und double sind beide ungenau. Die Darstellung Fehler von Dezimalstellen ist null, wenn die Menge dargestellt wird, ist genau die gleich einem Bruchteil von der form (x/10n), die für Sie geeignete Wahl von x und n. Die Darstellung der Fehler der Doppel-null ist, wenn die Menge genau gleich, zu einem Bruchteil der form (x/2n) wieder, die für Sie geeignete Wahl von x und n.
Wenn die Mengen, die Sie beschäftigen, sind nicht die Fraktionen, die form, dann erhalten Sie eine Darstellung, Fehler, Zeit. Insbesondere erwähnen Sie auch unter Wurzeln. Viele Wurzeln sind irrationale zahlen; Sie haben keine gebrochene form, so dass jede Darstellung, die verwendet Fraktionen geben wollte kleine Fehler.
Können Sie erklären, was Sie tun, in äußerst genauer?
DecimalMath enthält alle Funktionen, die in
System.Math
Klasse mitdecimal
argument AnalogieHinweis : es ist "meine Bibliothek" und enthält auch einige Beispiele in es
Verwenden Sie den Datentyp decimal, der mit 128 bit Genauigkeit:
http://msdn.microsoft.com/en-us/library/364x0z75(v=vs. 80).aspx