detaillierte Erläuterung des Problems der Doppelgenauigkeit Multiplikationsgenauigkeit in .net
In C#wird das Ergebnis des Ausdrucks double i = 10 * 0.69;
ist, dass i
einen Wert von 6.899999999999999999999999999999995, im eher erwarteten 6.9995, eher als das erwartete 6.99999999999995, eher als der erwartete 6.99999999999995, eher als der erwartete 6.999999999999995, eher als das erwartete 6.999999999999995 als das erwartete 6.9999999999999995, eher als der erwartete 6.999999999999995 als das erwartete 6.9999999999999995, eher im als der erwarteten als das erwartete zu haben. Dies wirft die Frage auf: Gibt es einen Fehler in der doppelten Präzisionsmultiplikation in .NET?
Binäre Darstellung und schwebende Punktoperation
]Um dieses Verhalten zu verstehen, müssen Sie ein tiefes Verständnis der Feinheiten binärer Darstellungen und Gleitkommaoperationen haben. Die schwimmenden Punktformate stellen ungefähr reelle Zahlen als endliche Binärwerte dar, was zu Präzisionsbeschränkungen führen kann.
Die scheinbar einfachen 0.69 kann nicht genau in binär dargestellt werden. Es erfordert eine unendliche Schleife von Binärzahlen. Die im doppelte
Datentyp gespeicherte binäre Darstellung ist ein ungefährer Wert von 0,69.
konstanten optimiert und gespeichert von Compiler
]In dem bereitgestellten Code -Snippet optimiert der Compiler den Ausdruck durch Multiplikation und speichert das Ergebnis als Konstante in der ausführbaren Datei. Dies geschieht, weil diese Werte zur Kompilierungszeit bekannt sind. Der gespeicherte Wert ist eine schwimmende Punktnäherung von 6,9, die etwas kleiner als der tatsächliche Wert ist.
Lösungen und alternative Datentypen
] Um dieses Problem zu lösen und genauere Ergebnisse zu erzielen, kann der Datentyp Decimal
verwendet werden, der so konzipiert ist, dass nicht repetitive Dezimalwerte mit höherer Genauigkeit dargestellt werden. Der Ausdruck dezimal i = 10m * 0,69m;
erzeugt ein Ergebnis von 6,9 m.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3