2012-03-27 8 views
4

Lieber Stackoverflowers,PHP Handelsrunde Währung

Ich mag würde wissen, was sollutions Sie für das folgende Problem kann kommen:

Das ist, was ich habe:

13.90 
5.03 
7.06 
2.51 

Dies ist was ich will:

13.90 
5.05 
7.05 
2.50 

Grundsätzlich: Ich möchte Währung auf einer kommerziellen Basis runden. Es letzte Nachkommastelle nur aufgerundet werden, um 5 oder 10 (Hinzufügen einer zur ersten Ziffer) oder abgerundet auf 5 oder 0.

+0

5,03 mit 5,05 und 2,51 mit 2,50 zu vergleichen, die Regel für die getroffen werden, Round Up/Down Entscheidung? – Daxcode

+1

Ihr Rundungsalgorithmus ist inkonsistent. wenn 03 Runden auf 05, und 51 Runden auf 50, dann sollte 06 auf 05, nicht auf 10 runden. Wenn 06 Runden auf 10, 03 sollten auf 00 runden. –

+0

Danke für's Bemerken! Das habe ich falsch gemacht! –

Antwort

9

Eine allgemeine Formel für zum nächsten x Runden:

round(input/x) * x 

Und ein Beispiel für Ihren Anwendungsfall:

round(5.03/.05) * .05 = round(100.6) * .05 = 101 * .05 = 5.05 
+0

Vielen Dank für Ihre Antwort. Genau das habe ich gebraucht :) Prost! –

+0

Mit 'round (input/x) * x' arbeiten Sie mit den OP-Nummern, weil sie einfach genug sind: Sie haben wenige Dezimalstellen und' input/x' kann in diesem Fall kein Mittelpunkt sein. Beachten Sie jedoch, dass, wenn "input" und "x" in Dezimalzahlen ausgedrückt werden, Rundungsfehler für die interne Konvertierung in Binärwerte und für die Division auftreten. In komplizierteren Fällen kann die Formel in Gleitkommaarithmetik fehlschlagen. Mögliche Lösungen: Ganzzahlarithmetik oder Fehleranalyse und Mittelpunkterkennung. – vinc17

5
<?php 

$int = 5.03; 
$int *= 20; 
$int = ceil($int); 
$int /= 20; 

echo $int; 

Sie müssen nur die Auflösung der Rundung zu definieren, indem die Zahl multipliziert (und später wieder teilen). Es ist ein einfaches mathematisches Problem.

+0

Vielen Dank für Ihre Antwort, Wahrheit! –