2009-10-20 8 views
7

Je voudrais résoudre le mécanisme arrondi à l'aide php4,5.2 et ci-dessous (non 5.3) Actuellement, je suis en train de faire 0,05 arrondi, quelque chose comme cette page:Arrondi Mécanisme pour le plus proche de 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 

J'essaie d'utiliser une chaîne pour la diviser et ajouter manuellement, mais pas vraiment une bonne solution, espérant ici trouver quelqu'un pour le résoudre.

+0

fonction rndfunc ($ x) { rond de retour ($ x 2 *, 1)/2; } c'est du travail! Merci beaucoup Mauris – Shiro

+0

Si une réponse a résolu votre problème, veuillez cliquer sur la grosse coche à côté de leur réponse. – random

+0

@Shiro - yep comme e.c.ho dit, mettre une croix de sorte que lorsque d'autres viennent à cette question, ils connaissent la réponse. – mauris

Répondre

10

utilisation de cette fonction

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

Vous vous retrouvez avec un seul nombre après la virgule si elle se termine par zéro (0). – random

+2

alors vous pouvez simplement le formater avec number_format() – mauris

+2

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

0

Multipliez par deux, puis arrondissez, puis divisez par deux.

+3

's/two/twenty/g' – hobbs

1

Vous souhaitez fondamentalement mapper des valeurs à une grille. La grille est définie comme a multiple of .05. En général, vous devez trouver les multiplicands entre lesquels votre valeur se situe.

Ce n'est pas dans le tableau sont les nombres négatifs. Vous devez décider si vous voulez arrondir à partir de zéro (symétrique) ou toujours dans le même sens (c'est-à-dire positif).

code:

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

Il y a une division par zéro sur la ligne' $ rest = '. – random

+0

@ e.c.ho: comment cela peut-il être si '$ step' n'est pas zéro? – xtofl

+0

Ran le code et c'est le message d'erreur qui est revenu en arrière. – random

5

Conceptuellement, la procédure peut être faite comme suit:

  1. division par 0,05
    • une ou plusieurs fois par (1/0.0 5)
  2. arrondi au plus proche entier
  3. Multiplier par 0,05
0

Conseil: -

$ input1 = 24,05;

$ things = abs ($ entrée * 20); // 481 ".05" s

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

$ ouput = $ tenpcnt/20;

echo $ ouput; // 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

Je suis sûr qu'il ya des solutions plus élégantes, mais cela semble convenir à la tâche:

<?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 gagne - Je pensais qu'il y avait une méthode plus simple. (-: – Nathan

0

expansion un peu @xtofl pour permettre des mesures plus précises (pas techniquement requis pour cette question)

$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

Merci @mauris pour la solution pour résoudre mon problème sur la Malaisie TPS roundi mécanisme ng. Cela fonctionne aussi en SQL.

DECLARE @tempTable AS TABLE (Nombre décimal (20,4));

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

SELECT Nombre, rond (numéro 2 *, 1)/2 'arrondi' dE @tempTable

Questions connexes