Ich habe ein Problem mit C #. Um genau zu sein mit dem Math.pow (). Wenn ich 15 ^ 14 berechnen möchte, bekomme ich "29192926025390624". Aber wenn ich es mit Wolfram Alpha berechne bekomme ich "29192926025390625". Wie Sie sehen können, ist dieser einzige Unterschied 1 Zahl. Wolfram Alpha ist jedoch korrekt. Warum ist C # nicht? und wie behebe ich das, damit ich den richtigen Wert in C # 7 bekommen kann?
Mein Code ist ziemlich einfach, da ich gerade mit hartcodierten Beispielen versuche. Also was ich mache ist: Math.Pow(15,14);
Dies ergibt 29192926025390624
. Und nicht "29192926025390625", was die richtige Antwort ist.
Links: Wolfram Alpha
Math.Pow
arbeitet mit Gleitkommatypen, die per Definition ungenau sind. Wenn Sie Ganzzahlen mit beliebiger Genauigkeit benötigen, verwenden Sie einen Integer-Typ beliebiger Genauigkeit, z. B. BigInteger Struktur. BigInteger hat auch eine Methode Pow .
Math.Pow arbeitet mit Doppelpunkten. Diese Implementierung mit langen bekommt die richtige Antwort:
%Vor%Math.Pow arbeitet mit Doppelpunkten. Doppel sind 64-Bit Gleitkommazahl und haben etwa 15-16 Stellen Genauigkeit in C # und daher Was Sie sehen, ist ein Rundungsfehler. So funktionieren Gleitkommazahlen.
Wenn Sie mehr Präzision benötigen, versuchen Sie, dezimal zu verwenden. Es ist 128 Bits und verwendet 10 als Basis. Dies gibt Ihnen eine genaue Darstellung von Zahlen bis zu 28-29 signifikanten Ziffern. Sie können einfach Ihre eigene Pow-Methode für Dezimalzahlen definieren.
Wenn decimal
nicht ausreicht, wechseln Sie zu BigInteger wurde in .NET 4 hinzugefügt.
Math.Pow () arbeitet korrekt mit dem doppelten Datentyp Sehen Sie dies.
%Vor%Hoppla, Sorry, Wert nach Haltepunkt prüfen; in deinem Programm;