Die Frage ist, warum geben diese Code-Snippets andere Ergebnisse?
%Vor%und
%Vor%Der Delphi-Code gibt mir 816, während der c # -Code mir 0 gibt. Mit einem Taschenrechner bekomme ich 775. Kann mir bitte jemand eine detaillierte Erklärung geben?
Vielen Dank!
Beachten Sie, dass Sie hier an der Grenze der Genauigkeit des Datentyps Double sind, was bedeutet, dass die Berechnungen hier nicht genau sind.
Beispiel:
%Vor%was gesagt werden kann wie:
%Vor%und so:
%Vor%In Wirklichkeit wird der Wert in .NET eher wie folgt aussehen:
%Vor%Beachten Sie die Rundung dort. Daher erhalten Sie auf dieser Ebene nicht die richtigen Antworten.
Dies ist sicherlich keine Erklärung für diese genaue Situation, aber es wird helfen, das Problem zu erklären.
Was jeder Informatiker über Gleitkommaarithmetik wissen sollte
Ein C # double hat höchstens 16 Stellen Genauigkeit. Wenn Sie 4.271343859532459e + 18 nehmen und mit 5 multiplizieren, erhalten Sie eine Anzahl von 19 Ziffern. Sie möchten eine Zahl mit nur 3 Ziffern haben. Double kann das nicht machen.
In C # kann der Decimal-Typ mit diesem Beispiel umgehen - wenn Sie das 123M-Format zum Initialisieren der Dezimalwerte verwenden.
%Vor%Das ergibt 775,00, was die richtige Antwort ist.
Ich denke, dass dies ein Fehler ist, der durch die begrenzte Genauigkeit verursacht wird (Vor allem, weil Doppel statt Ganzzahlen verwendet werden). Vielleicht ist d1 nach der Zuweisung nicht dasselbe. d2 * d2 wird sicherlich anders sein als der korrekte Wert, da er größer als 2 ^ 32 ist.
Da 5 * d1 sogar größer als 2 ^ 64 ist, hilft auch die Verwendung von 64-Bit-Ganzzahlen nicht. Sie müssten Bignums oder eine 128-Bit-Integer-Klasse verwenden, um das korrekte Ergebnis zu erhalten.
Wie andere Leute bereits betont haben, ist die doppelte Genauigkeit nicht genau genug für den Umfang der Berechnungen, die Sie durchführen möchten. Delphi verwendet standardmäßig "erweiterte Genauigkeit", wodurch weitere 16 Bit über Double hinzugefügt werden, um eine genauere Berechnung zu ermöglichen. Das .NET-Framework verfügt nicht über einen Datentyp mit erweiterter Genauigkeit.
Ich bin mir nicht sicher, welchen Typ Ihr Rechner verwendet, aber anscheinend macht er etwas anderes als Delphi und C #.
Wie von den anderen kommentiert, ist das Double für Ihre Berechnung nicht präzise genug. Die Dezimalzahl ist eine gute Alternative, obwohl jemand darauf hingewiesen hat, dass es gerundet wäre, ist es nicht.
In C # kann der Decimal-Typ dieses Beispiel nicht einfach verarbeiten, da 4.271343859532459e + 18 auf 427134385959532460000 gerundet wird.
Dies ist nicht der Fall. Die Antwort, wenn Sie Dezimal verwenden, wird korrekt sein. Aber wie er sagte, ist der Bereich anders.