Problem der Inkonsistenz der MySQL-Multiplikations- und Divisionsgenauigkeit (vier Dezimalstellen nach der Division)

Problem der Inkonsistenz der MySQL-Multiplikations- und Divisionsgenauigkeit (vier Dezimalstellen nach der Division)

Frage

Als ich heute eine Projektfunktion schrieb, musste ich eine statistische Berechnung des Geldbetrags durchführen und dann die Einheiten umrechnen. Also schrieb ich eine Anweisung ähnlich der folgenden Funktion, aber die Daten, die ich erhielt, hatten 4 Dezimalstellen, und normalerweise benötigen wir nur 2 Stellen.

select total_fee / 100 from orders

Suche weiter nach Daten und führe eine Präzisionskonvertierung durch. Nach einer Weile bin ich mit den Daten nicht zufrieden. Teste weiter

prüfen

Beim Testen auf Fehler und unbekannte Situationen müssen wir die Reproduktion minimieren, den Test rationalisieren und verhindern, dass andere Anweisungen die Ergebnisse beeinträchtigen.

wählen Sie 1/100;
// Holen Sie sich 0,0100
wählen Sie 1 * 0,01;
// Holen Sie sich 0,01

Es läuft auf 3/4 Geräten und die Ergebnisse sind in Umgebungen mit unterschiedlichen MySQL-Versionen dieselben.

Wir wissen also, dass in MySQL Multiplikation und Division nach dem Komma unterschiedliche Genauigkeiten haben.

Da ich in den inländischen Foren keine passenden Informationen finden konnte, suchte ich in ausländischen Foren, um danach zu suchen, Fragen zu stellen und zu kommunizieren.

Antwort

Zunächst einmal möchte ich mich bei den anderen Senioren für ihre Antworten und Ratschläge bedanken. Wir werden auch die Fehlerbehebung des Problems so detailliert wie möglich dokumentieren.

Zivilisationen überleben, weil sie ein Gedächtnis haben. Ich hoffe, dieser Artikel kann mehr Freunden helfen.

  • Die Standardgenauigkeit der Division beträgt 4 Dezimalstellen.
  • Die Genauigkeit der Multiplikation wird durch die Summe der Genauigkeiten der Operanden bestimmt. Im Beispiel beträgt die Genauigkeit von 1*0,01 beispielsweise 0 und 2 Dezimalstellen, sodass für 0+2 = 2 ebenfalls eine Genauigkeit von 2 Ziffern erforderlich ist.

prüfen

wählen Sie 1,00 * 0,01;
// Ergebnis 0,0100

Im Einklang mit der Schlussfolgerung der Berufung. Wir danken den ausländischen Senioren für ihre Anleitung.

Bei der Division wird eine Genauigkeit von 2 Ziffern verwendet

Wenn wir zur Lösung unseres Problems unbedingt die Division verwenden möchten, können wir die Genauigkeit mithilfe einer Funktion umrechnen.

CAST( @x / @y AS DECIMAL(m,n) )

Sie können die Parameter von DECIMAL auf Baidu nachschlagen. Im Grunde kann das jeder verstehen, der schon einmal eine Tabellenstruktur erstellt hat.

@x und @y sind Divisor und Dividende.

Gleichzeitig habe ich mich auch gefragt, ob es möglich ist, die Standarddivisionsgenauigkeit in MySQL festzulegen, sodass wir nicht jedes Mal Funktionsberechnungen in SQL verwenden müssen.

Antwort des Seniors: Wenn Sie nicht möchten, dass manchmal unerwartete Situationen auftreten, müssen Sie jedes Mal eine Typkonvertierung erzwingen.

MySQL-bezogene Dokumentation

https://dev.mysql.com/doc/refman/8.0/en/arithmetic-functions.html

Bei einer Division mit / ist die Skalierung des Ergebnisses bei Verwendung von zwei Operanden mit exakten Werten die Skalierung des ersten Operanden plus dem Wert der Systemvariable div_precision_increment (der standardmäßig 4 ist). Beispielsweise hat das Ergebnis des Ausdrucks 5,05 / 0,014 eine Skalierung von sechs Dezimalstellen (360,714286).

Präzisionsregeln für die Division

Aus der oben zitierten Literatur wissen wir, dass bei der Berechnung mit zwei Zahlen die Genauigkeit des Ergebnisses durch die Genauigkeit des ersten Operanden + den Wert der Systemvariable div_precision_increment bestimmt wird. Beispielsweise ist die Genauigkeit von 1 in unserem Beispiel 0, und die Systemvariable precision beträgt standardmäßig 4 Ziffern, sodass das Ergebnis eine Genauigkeit von 4 Ziffern aufweist.

setze div_precision_increment = 2;
// Führen Sie select 1 / 100 erneut aus. Sie erhalten 0,01, was dem gewünschten Ergebnis entspricht.

Daher können wir auch die Standardgenauigkeit der Division ändern, indem wir die Standardvariablen modifizieren.

Jetzt testen wir

wählen Sie 1,0 / 100;
// Das Ergebnis 0,010 steht im Einklang mit den obigen Schlussfolgerungen

Zusammenfassen

Dies ist das Ende dieses Artikels über die inkonsistente Genauigkeit von MySQL-Multiplikation und -Division und vier Dezimalstellen nach der Division. Weitere relevante Inhalte zur Genauigkeit von MySQL-Multiplikation und -Division finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Analyse eines Mordfalls aufgrund der Genauigkeit des MySQL-Zeitstempels

<<:  Detaillierte Erläuterung der Nginx-Statusüberwachung und Protokollanalyse

>>:  Lösung für das Problem des Sitzungsfehlers, der durch den Nginx-Reverse-Proxy verursacht wird

Artikel empfehlen

So verwenden Sie CSS-Attributselektoren zum Spleißen von HTML-DNA

CSS-Attributselektoren sind großartig. Sie können...

Grundlegende Referenztypen der erweiterten JavaScript-Programmierung

Inhaltsverzeichnis 1. Datum 2. RegExp 3. Original...

Beispiel-Tutorial für MySQL-Datenbanktransaktionen

Inhaltsverzeichnis 1. Was ist eine Transaktion? 2...

Schritte zum Kapseln der Karussellkomponente in vue3.0

Inhaltsverzeichnis 1: Kapselungsidee 2. Verpackun...

Webdesign-Tutorial (6): Behalte deine Leidenschaft für Design

<br />Vorheriger Artikel: Webdesign-Tutorial...

Erläuterung des Vue.js $refs-Anwendungsfalls

Trotz Props und Events müssen Sie manchmal immer ...

CSS zum Erstellen eines dynamischen sekundären Menüs

Dynamisches Implementieren eines einfachen sekund...

Allgemeine Befehle zum Bereitstellen von InfluxDB und Mongo mit Docker

Bereitstellen einer Datenbank basierend auf Docke...