Heute tauchen wir in technische Details und erzählen über den Unterschied in den Berechnungen mit Gleitkommazahl in .NET und .NET Framework.

Einführung

In der Version .NET Core 3.0 wurden einige Änderungen in die Syntax-Analyse und Formatierung mit Gleitkomma für Entsprechen dem IEEE 754-2008-Standard verwirklicht. Sie können über die Änderungen ausführlich hier lesen. Im Rahmen der Arbeit mit Stimulsoft-Softwares erscheinen diese Änderungen bei den Rundungen der Zahlen und Entstehen von „negativer“ Null.

Negative Null

Negative und positive Null werden in der mathematischen Analyse als konventionelles Symbol für negative und positive infinitesimale Menge verwendet. Für typische Programmieraufgaben ist ausreichend, einfache Null zu verwenden, aber für einige erweiterten mathematischen Berechnungen braucht man manchmal solche Zahlen. Die „negative“ Null wurde speziell für solche Berechnungen hinzugefügt.

Die negative Null ist das Ergebnis von Rundungen der negativen Zahlen. Zum Beispiel, das Ergebnis des Erfüllens von der Operation Math.Round(-0.01, 0) war früher „0“, und ist derzeit „-0“. Es erscheint auch bei der Formatierung der Zahlen (die Formate Number, Currency, Percent), weil bei der Formatierung die Rundung verwendet wird. Mathematisch ist dieser Ansatz genauer. Aber, aus der Sicht des Programmierens ist es „breaking changes“, weil das gewöhnliche Benehmen der Rundung-Operation sich ändert, und es gibt keine Möglichkeit, diese Änderung zu deaktivieren.

Um das Problem mit der negativen Null zu lösen, haben wir in unseren .NET Core-Softwares eine Modifizierung verwirklicht, und derzeit wird die negative Null durch eine „gewöhnliche“ Null standardmäßig ersetzt. Aber wenn Ihre Berechnungen dennoch die negative Null brauchen, können Sie die Option StiOptions.Engine.AllowNegativeZero = true einstellen.

Die Rundung der Zahlen

Eine der Aktualisierungen in .NET Core 3.0 ist die Änderung der Zahlen mit Gleitkomma in der Syntax-Analyse. Diese Aktualisierung war notwendig, weil in solchen Typen wie float und double die Zahl in der Binärform gespeichert wird und in dezimal nur bei der Rundung oder beim Anzeigen auf dem Bildschirm umgewandelt. Zum Beispiel, die Zahl „0,0045“ wird tatsächlich im Computer-Speicher als „0.0044999999999999996“ gespeichert. Vor dem Anzeigen auf dem Bildschirm stellt die spezielle Methode ursprüngliche Zahl aus dieser binären Darstellung wieder her. Darum ist es unmöglich, in float- und double-Typen genau die Dezimalzahlen zu schreiben, weil sie immer einige Fehlerquote haben.

Früher unterschieden sich diese Algorithmen von im IEEE 754-2008-Satndard verwendeten Algorithmen. Darum konnten Sie unter verschiedenen Systemen verschiedenen Berechnungsergebnisse erhalten. Die Berechnungsergebnisse entsprechen derzeit dem Standard. Aber können sich diese Ergebnisse von vorherigen unterscheiden. Es beeinflusst die Arbeit von standardmäßigen Funktion Round, deren Ergebnis auch anders sein kann.

Im Gegenzug, es verursacht die Probleme bei einigen Benutzern, die die Versionen von seinen Softwares auf .NET Framework und .NET haben und verschiedene Ergebnisse in diesen Versionen erhalten. Bemerken Sie!

Um die Berechnungsergebnisse gleichmäßig und vorhersehbar zu machen, empfehlen wir folgenden Ansatz: konvertieren Sie alle Typen in Decimal in allen kritischen Berechnungen. Es garantiert korrekte Rundung in jeden Berechnungen.
Es ist nicht so kompliziert, ein Paar Berichte zu modifizieren. Aber einige Benutzer brauchen zahlreiche früher erstellte Berichte bearbeiten. Dafür haben wir eine neue Option hinzugefügt:
StiOptions.Engine.ForceConversionToDecimalInTextFormat = false;
Standardmäßig ist die Option deaktiviert. Wenn Sie sie auf true stellen, werden die Argumente float und double bei der Formatierung des Textes in solchen Formaten wie Number, Currency und Percentage automatisch in Decimal für genauere Rundung umgewandelt.

The MidpointRounding parameter

Um die Bankrundung zu erhalten, muss man in der standardmäßigen Funktion Math.Round den Parameter MidpointRounding.AwayFromZero verwenden. Für mehr bequeme Arbeit haben wir diesen Parameter auch in unserer Funktion Round hinzugefügt. Nach der Abfrage unserer Benutzer haben wir auch ermöglicht, den Wert dieses Parameters standardmäßig zu stellen, damit die Benutzer alle Berichtsvorlagen nicht ändern brauchen. Dafür muss man den Wert folgender Option stellen:
StiOptions.Engine.MidpointRounding = MidpointRounding.AwayFromZero;
So können Sie mit oben erwähnten Optionen bequem die Genauigkeit der Berechnungen erhöhen und einige Probleme bei der Migration des Produktes auf .NET vermeiden.
By using this website, you agree to the use of cookies for analytics and personalized content. Cookies store useful information on your computer to help us improve efficiency and usability. For more information, please read the privacy policy and cookie policy.