2009-10-20 10 views
7

me gustaría resolver mecanismo de redondeo mediante el uso de php4,5.2 y por debajo (no 5.3) Actualmente estoy haciendo 0,05 redondeo, algo parecido a esta página:Mecanismo de redondeo para más cercana 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 

Intento usar string para dividir y agregar manualmente, pero no es realmente una buena solución, con la esperanza de que aquí pueda encontrar a alguien que la resuelva.

+0

función rndfunc ($ x) { ronda de retorno ($ x * 2, 1)/2; } ¡es trabajo! Muchas gracias Mauris – Shiro

+0

Si una respuesta resolvió su problema, haga clic en la marca grande al lado de su respuesta. – random

+0

@Shiro - sí, como e.c.ho dijo, ponga un tic para que cuando otros lleguen a esta pregunta, sepan la respuesta. – mauris

Respuesta

10

uso esta función

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

Usted termina con un solo número después del decimal si termina en cero (0). – random

+2

, simplemente puede formatearlo con number_format() – mauris

+2

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

0

Multiplique por dos, luego redúntelo, luego divida por dos.

+3

's/two/twenty/g' – hobbs

1

Básicamente, desea asignar valores a una cuadrícula. La cuadrícula se define como a multiple of .05. En general, necesitas encontrar los multiplicandos en los que se encuentra tu valor.

Lo que no es en la tabla son los números negativos. Debe decidir si desea redondear desde cero (simétrico) o siempre en la misma dirección (es decir, positivo).

código:

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

Hay una división por cero en la línea' $ rest = '. – random

+0

@ e.c.ho: ¿cómo puede ser eso si '$ step' no es cero? – xtofl

+0

Se ejecutó el código y ese es el mensaje de error que regresó volando. – random

5

Conceptualmente, el procedimiento se puede realizar como:

  1. Dividir por 0,05
    • o multiplicar por (1/0.0 5)
  2. Ronda entero más cercano a
  3. Multiplicar por 0,05
0

Consejo: -

$ INPUT1 = 24.05;

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

$ tenpcnt = abs ($ cosas/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

Estoy seguro de que hay soluciones más elegantes, pero esto parece adaptarse a la tarea:

<?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 gana - supuse que había un método más simple. (-: – Nathan

0

Ampliando un poco en @xtofl para permitir medidas más precisas (no técnicamente requiere para esta pregunta)

$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

Gracias @mauris de la solución para resolver mi problema en Malasia GST fase en el mecanismo ng. También funciona en SQL.

DECLARAR @tempTable AS TABLE (Número decimal (20,4));

VALORES

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

Número SELECT, redondo (Número de * 2, 1)/2 AS 'redondeado' FROM @tempTable

Cuestiones relacionadas