2009-10-20 3 views
7

Ich mag würde Rundungsmechanismus lösen, indem php4,5.2 mit und unten (nicht 5.3) Derzeit mache ich 0,05 Runden, so etwas wie diese Seite:Rounding Mechanismus zum nächsten 0,05

http://www.bnm.gov.my/index.php?ch=209&pg=657&ac=568

before rounding | after rounding 

      89.90 | 89.90 

      89.91 | 89.90 

      89.92 | 89.90 

      89.93 | 89.95 

      89.94 | 89.95 

      89.95 | 89.95 

      89.96 | 89.95 

      89.97 | 89.95 

      89.98 | 90.00 

      89.99 | 90.00 

Ich versuche, String zu verwenden, um es zu trennen und manuell hinzufügen, aber nicht wirklich eine gute Lösung, in der Hoffnung, hier jemanden zu finden, um es zu lösen.

+0

Funktion rndfunc ($ x) {return round ($ x * 2, 1)/2; } es ist Arbeit! Vielen Dank Mauris – Shiro

+0

Wenn eine Antwort Ihr Problem gelöst hat, klicken Sie bitte auf das große Häkchen neben ihrer Antwort. – random

+0

@Shiro - yep wie ec.co sagte, setzen Sie ein Häkchen, so dass, wenn andere zu dieser Frage kommen, sie die Antwort wissen. – mauris

Antwort

10

Verwendung dieser Funktion

function rndfunc($x){ 
    return round($x * 2, 1)/2; 
} 
+0

Sie erhalten nur eine Zahl nach dem Komma, wenn sie in Null (0) endet. – random

+2

dann können Sie es einfach mit number_format() formatieren – mauris

+2

sprintf ('% 0.2f', rndfunc ($ x)); – Nathan

0

Mit zwei multiplizieren, dann rund, dann durch zwei teilen.

+3

's/zwei/zwanzig/g' – hobbs

1

Grundsätzlich möchten Sie Werte einem Raster zuordnen. Das Raster ist definiert als a multiple of .05. Im Allgemeinen müssen Sie die Multiplikanden finden, zwischen denen Ihr Wert liegt.

Was ist nicht in der Tabelle sind die negativen Zahlen. Sie müssen entscheiden, ob Sie von Null (symmetrisch) oder immer in die gleiche Richtung (d. H. Positiv) abrunden wollen.

Code:

$step = .05; 
$multiplicand = floor($value/$step); 
$rest = $value % $step ; 
if($rest > $step/2) $multiplicand++; // round up if needed 
$roundedvalue = $step*$multiplicand; 
+0

Es gibt eine Division durch Null auf der' $ Rest = 'Linie. – random

+0

@ e.c.ho: Wie kann das sein, wenn '$ step' nicht Null ist? – xtofl

+0

Lief den Code und das ist die Fehlermeldung, die zurückfliegt. – random

5

Konzeptionell kann das Verfahren durchgeführt werden, wie:

  1. Divide by 0,05
    • oder mehrfach durch (1/0.0 5)
  2. Runde zur nächsten ganzen Zahl
  3. Multipliziert mit 0,05
0

Tipp: -

$ input1 = 24,05;

$ sachen = abs ($ input * 20); // 481 ".05" s

$ tenpcnt = abs ($ sachen/10); // 48 ".05" s

$ output = $ tenpcnt/20;

echo $ output; // 2,40

0
function round5Sen ($value) { 

    return number_format(round($value*20,0)/20,2,'.',''); 
} 

echo round5Sen(155.13); 
echo "\n"; 
echo round5Sen(155.12); 
echo "\n"; 
echo round5Sen(155.0); 
echo "\n"; 
echo round5Sen(155.18); 
echo "\n"; 
0

Ich bin sicher, es elegantere Lösungen sind, aber dies scheint die Aufgabe gerecht zu werden:

<?php 

// setup test 
$start_num = 89.90; 
$iterations = 10; 

// loop through test numbers 
for ($i = 0; $i < $iterations; $i++) { 
    nickleRound($start_num + (0.01 * $i)); 
    echo "\n\n"; 
} 

// 
function nickleRound($num) { 
    $p = 0.05; 
    echo "\n" . 'p= ' . $p; 

    $num = round($num, 2); 
    echo "\n" . 'num= ' . $num; 

    $r = ($num/$p); 
    echo "\n" . 'r= ' . $r; 

    $r2 = ceil($r) - $r; 
    echo "\n" . 'r2= ' . $r2; 

    $a = round($num, 1); 
    if (($r2 > 0) && ($r2 < 0.5)) { 
    $a = $a + 0.05; 
    } 
    echo "\n" . 'a= ' . $a; 
} 
+0

Mauris gewinnt - Ich dachte, es gäbe eine einfachere Methode. (-: – Nathan

0

ein wenig auf @xtofl Erweiterung für präzisere Schritte zu ermöglichen (technisch nicht erforderlich für diese Frage)

$step   = 0.0005; 
    $multiplicand = floor($value/$step); 
    $rest   = fmod($value, $step); 

    $value = $step * $multiplicand; 

    if ($rest > $step/2) { 
     $value += $step; 
    } 
0
//Round to nearest 0.05 
echo round ($number * 20, 0)/20; 

//Round Up to nearest 0.05 
echo ceil ($number * 20)/20; 

//Round Down to nearest 0.05 
echo floor ($number * 20)/20; 
0

Danke @mauris für die Lösung meines Problems auf Malaysia GST roundi zu lösen ng Mechanismus. Es funktioniert auch in SQL.

DECLARE @tempTable AS TABELLE (Nummer Dezimal (20,4));

INSERT INTO @tempTable VALUES (89,90), (89,91), (89,92), (89,93), (89,94), (89,95), (89,96), (89,97), (89,98), (89,99)

SELECT Anzahl, rund (Nummer * 2, 1)/2 als 'Abgerundete' FROM @tempTable