Heim > Artikel > Backend-Entwicklung > Warum behält das Finanzsystem nur zwei Dezimalstellen bei? Was ist, wenn es einen Betrag mit mehr als zwei Dezimalstellen gibt?
Ich habe plötzlich ein Problem entdeckt. Das Finanzsystem in unserem Leben hat höchstens zwei Dezimalstellen, z. B. 12,37, was jedoch auch bei der Berechnung mit zwei Dezimalstellen und Nicht-Ganzzahlen der Fall ist mit drei Dezimalstellen, wie zum Beispiel bei Banken Der Tagessatz muss auf drei Dezimalstellen oder mehr berechnet werden, aber warum sehen wir den Saldo nicht auch mit zwei Dezimalstellen? Wie wird es weggelassen? Ich finde diese Frage interessant.
Meine Vermutung:
Solange unser Finanzsystem nur zwei Dezimalstellen verwendet, werden bei der Generierung von mehr als zwei Dezimalstellen die folgenden Dezimalstellen nicht direkt verwendet, anstatt eine nach fünf hinzuzufügen Wenn es hinzugefügt wird, führt dies zu zusätzlichem Geld für den Benutzer. Selbst wenn es zusätzliche 0,001 Yuan sind, ist der Verlust im gesamten System enorm. Wenn es also mehr als zwei Dezimalstellen gibt, können Sie das nur direkt weglassen Nach Dezimalstellen müssen Sie 0,009 weglassen, auch wenn es 0,239 ist. Dieser Verlust von 0,009 Yuan kann nur vom Benutzer getragen werden.
Zum Beispiel haben Banksysteme, Alipay, alle zwei Dezimalstellen für das Saldofeld, wobei ich plötzlich an dieses Problem dachte, und ich bin so verwirrt. Ich weiß nicht, ob ich es bin. decimal(10,2)
Wenn ich das denke, habe ich dann das Gefühl, dass wir die meiste Zeit viel Geld verloren haben müssen? Ich wollte dieses Problem ursprünglich lösen, indem ich ein paar Dezimalstellen mehr beibehielt, aber ich habe das Gefühl, dass es unendlich viele Dezimalstellen geben kann, was immer noch unwahrscheinlich ist. Wird es dem Benutzer nur einen kleinen Geldverlust bescheren.
Ich hoffe, jemand kann mir eine Anleitung geben. Ich bin so verwirrt, dass ich derzeit bei meinem Projekt auf ein solches Problem stoße.
Vielen Dank!
Antwortinhalt:
Meine Vermutung:
Solange unser Finanzsystem nur zwei Dezimalstellen verwendet, werden bei der Generierung von mehr als zwei Dezimalstellen die folgenden Dezimalstellen nicht direkt verwendet, anstatt eine nach fünf hinzuzufügen Wenn es hinzugefügt wird, führt dies zu zusätzlichem Geld für den Benutzer. Selbst wenn es zusätzliche 0,001 Yuan sind, ist der Verlust im gesamten System enorm. Wenn es also mehr als zwei Dezimalstellen gibt, können Sie das nur direkt weglassen Nach Dezimalstellen müssen Sie 0,009 weglassen, auch wenn es 0,239 ist. Dieser Verlust von 0,009 Yuan kann nur vom Benutzer getragen werden.
Zum Beispiel haben Banksysteme, Alipay, alle zwei Dezimalstellen für das Saldofeld, wobei ich plötzlich an dieses Problem dachte, und ich bin so verwirrt. Ich weiß nicht, ob ich es bin.
decimal(10,2)
Wenn Alipay beispielsweise Punkte und Einkaufsgutscheine verwendet, um mehrere Bestellungen gleichzeitig abzuziehen, scheint das Abzugsgeld entsprechend dem Anteil des Bestellbetrags auf jede Bestellung aufgeteilt zu werden, sodass eine Dezimalstelle angezeigt wird, diese Dezimalstelle jedoch vorhanden ist Es sind auch zwei Personen. Ich habe nicht genau aufgepasst und weiß nicht, ob sich die Abzüge bei Mehrfachbestellungen zu dem Betrag addieren, der bei der Bestellung abgezogen wurde.
Wenn ich das denke, habe ich dann das Gefühl, dass wir die meiste Zeit viel Geld verloren haben müssen? Ich wollte dieses Problem ursprünglich lösen, indem ich ein paar Dezimalstellen mehr beibehielt, aber ich habe das Gefühl, dass es unendlich viele Dezimalstellen geben kann, was immer noch unwahrscheinlich ist. Wird es dem Benutzer nur einen kleinen Geldverlust bescheren.
Ich hoffe, jemand kann mir eine Anleitung geben. Ich bin so verwirrt, dass ich derzeit bei meinem Projekt auf ein solches Problem stoße.
Vielen Dank!
Es gibt eine
Bankmethode zum Runden
, nämlich: Wenn der Wert der Rundungsziffer kleiner als 5 ist, wird er direkt verworfen.
Wenn der Wert der Rundungsziffer größer oder gleich 6 ist, wird er gerundet und verworfen Wenn die Rundungsziffer gleich 5 ist, gibt es zwei Arten von Situationen: Wenn nach 5 andere Zahlen (nicht 0) stehen, werden diese gerundet und verworfen, wenn nach 5 eine 0 steht (d. h. 5 ist die letzte Ziffer). ), dann wird anhand der Parität der Ziffer vor 5 beurteilt, ob ein Übertrag erforderlich ist. Ungerade Zahlen Übertragen, gerade Zahlen verwerfen.
Als Beispiel basierend auf den oben genannten Regeln nehmen wir an, dass Zahlen auf einzelne Ziffern genau sein müssen:
<code>49.6101 -> 50 49.499 -> 49 49.50921 -> 50 48.50921 -> 48 48.5101 -> 49</code>
Hier ist ein gutes Beispiel, um die Vorteile dieser Berechnungsmethode zu sehen:
2,55 + 3,45 = 6
Wenn wir eine Dezimalstelle beibehalten und 2,55 und 3,45 umrechnen wollen, sieht das so aus:
2,6 + 3,5 = 6,1
Natürlich handelt es sich hier um 0,1 mehr, sodass 2,55 laut unserer Berechnung „Auf fünf aufrunden, um das Doppelte zu verdoppeln“ tatsächlich 2,5 sein kann50, nach der 5 wollen wir If abrunden Es ist 0, dann beurteilen Sie anhand der Parität der vorherigen Ziffer, ob die vorherige Ziffer eine ungerade Zahl ist, dann ist sie nach dem Übertrag 2,65 Die vorherige 5 ist eine gerade Zahl, dann wird sie verworfen und das Ergebnis ist 3,4, also werden beide wie folgt berechnet:
2,6 + 3,4 = 6
Jemand hat 2,55 + 2,55 vorgeschlagen, was immer noch eine Überzählung von 0,1 ist, aber warum habe ich dieses Beispiel nicht angegeben? Da zum Runden von verwendet wird, wird diese Situation auch auftreten. Der entscheidende Punkt ist 2,45 + 2,45. Wir müssen diese Situation vermeiden, in der wir ohne Übertrag nahe am Mittelwert liegen, denn nur so kann 近似计算中舍去和进位的概率相等
garantiert werden. Dies ist der Hauptzweck. Denn solange die Genauigkeit begrenzt ist, müssen wir nur sicherstellen, dass die Wahrscheinlichkeiten bei einer großen Anzahl von Stichproben gleich sind.
Bei der Finanzierungsfrage in diesem Bereich müssen noch die geschäftlichen Bedürfnisse berücksichtigt werden. Nach meiner bisherigen Praxis habe ich mir 4 Nachkommastellen eingespart. Treffen Sie eine Wahl basierend auf verschiedenen Szenarien! Alle an der Rezeption angezeigten Beträge sind jedoch nur zweistellig und rufen Sie die Ziffern nach unten ab
ist normalerweise 向下取数
, zum Beispiel ist der tatsächliche Bargeldbetrag, der abgehoben werden kann, 10.1234
. 10.12
; nach dem Runden wird daraus
; Das ist eine Falle1000/3=333.3333333
333.33
Die allgemeine Praxis ist: 999.99
Die ersten beiden Perioden werden durch Rundung berechnet. Die letzte Ausgabe, berechnet durch Subtraktion:
Weitere Anweisungen
1000-333.33-333.33=333.34
Je nach Unternehmen sind die Anzahl der reservierten Ziffern und die Kompromisse unterschiedlich. Zum Beispiel der Nettowert des Fonds. Die Länge des Dezimalpunkts hat immer noch großen Einfluss auf die Höhe der Mittel. Je genauer dies ist, desto besser. Kommunizieren Sie mit dem Produkt über Ihre spezifischen Bedürfnisse!
Ich verstehe keine sehr professionellen Dinge, aber ich denke, dass es beim Aufbau eines Systems nichts zu beachten gibt. Alle Benutzer nach zwei Dezimalstellen verlieren Geld.
Wenn der Betrag 0,111 beträgt, wird er als 0,11 erfasst
Bei einem Betrag von 0,111 werden nur 0,11 ausgezahlt
Natürlich wird es keine zwei Ziffern sein, sowohl die Berechnung als auch die Speicherung sind 6 Ziffern und mehr (es ist nicht klar, ob es mehr sind, aber mindestens 6 Ziffern sind sicher)
Es ist nur die endgültige Bewertung Der Benutzer kann es sich später nicht auszahlen lassen, daher wird das Endergebnis nach einem bestimmten Algorithmus berechnet.
Die Ganzzahl 1 im Computer ist nicht gleich der Dezimalzahl 1,0, daher wird die Dezimalzahl in Geld zur Verarbeitung in eine Ganzzahl umgewandelt
Ich denke, es ist sicherer, Punkte als Maßeinheit für das in der Datenbank gespeicherte Betragsfeld zu verwenden. Wenn Sie es also an der Rezeption anzeigen, runden Sie es zuerst auf und dividieren Sie es dann durch 100, um das zu erhalten Yuan.
Die Berechnungsmethode verwendet „Geben“ und „Empfangen“, um die Punktzahl zu berechnen 1,1 Cent können weggeworfen werden und es werden nur 2 Yuan ausgegeben, das heißt, es wird nur der ganzzahlige Teil genommen.
„Sammeln“: Im Einklang mit dem Designprinzip, niemals zu leiden ein Verlust, 1 Cent wird auch als 1 Punkt gezählt. Dann wird anhand des Feldwerts beurteilt, ob ein Dezimalpunkt vorhanden ist. Wenn nicht, wird dieser einfach addiert. Wenn es auf Rundung basiert ... Alle Experten müssen die Werte mit Dezimalstellen beurteilen und damit umgehen. Der Grundsatz, niemals Geld zu verlieren, sollte auch für Finanzinstitute ein allgemeiner Grundsatz sein.Wenn Sie die Maßeinheit für einen Betrag verwenden und der Betrag Hunderte Millionen beträgt, müssen Sie das Maximum des Datentyps berücksichtigen und den Bereich nicht überschreiten.
Der Fragesteller hat tatsächlich die geheimen Methoden enthüllt, mit denen Finanzinstitute Geld sammeln, hahaha.
收款时直接把分以后的数字进位处理,付款时直接截去分以后的小数位。
展示显示2位小数不代表系统中处理都是2位小数吧。我觉得应该会有很多位
要么四舍五入,要么向下取整,保留两位
合理的均分方法可以固定小数位.
比如100元平均分成N份(保留2为小数)并计算尾差:
<code><?php header('Content-Type: text/plain; charset=utf-8'); function tail($num, $fen) { $avg = bcdiv($num, $fen, 2); //除 $tail = bcsub($num, $avg*($fen-1), 2); //减 echo $num.'='.str_repeat($avg.'+', $fen-1).$tail."\n"; echo "$num=$avg*($fen-1)+$tail\n"; return array($avg, $tail); } var_export(tail(100, 3)); var_export(tail(100, 6)); //输出: 100=33.33+33.33+33.34 100=33.33*(3-1)+33.34 array ( 0 => '33.33', 1 => '33.34', ) 100=16.66+16.66+16.66+16.66+16.66+16.70 100=16.66*(6-1)+16.70 array ( 0 => '16.66', 1 => '16.70', )</code>
4舍5入,没有什么好纠结的,相信老祖宗的智慧。
从统计学的角度上来看,在大规模的应用的情况下,你们金融系统多出来的和少掉的钱是近似的,同样的,用户多出来和少掉的钱也是近似的,没有必要纠结。
没有做过金融系统开发,权当抛砖引玉了。