2012-05-17 101 views
5

tengo un algoritmo que realiza los siguientes cálculos:Sin función Truncar en PHP - ¿Opciones?

  1. ((0,50 * 0) + 7)/10 = 0,70
  2. ((0,70 * 10) + 9)/20 = 0,80
  3. ((0,80 * 20) + 7)/30 = 0,7666666667 -> Quiero este valor para truncar a 0,76

Así que puede alimentar al resto del cálculo como:

4a. ((0,76 * 30) + 8)/40 = 0,77

Y no para alimentar en cuando redondeado dos decimales como 0,77:

4b. ((0,77 * 30) + 8)/40 = 0,77

**** La siguiente parecen haber fallado y en lugar de forzar una ronda hasta 0,77: ****

El PHP sptrinf () función: PHP dropping decimals without rounding up

El number_format PHP() función: PHP: show a number to 2 decimal places

El suelo PHP() función: Truncate float numbers with PHP

  • ¿Hay alguna otra manera?
  • ¿Es posible lograr lo que quiero (truncar a dos lugares decimales) con PHP?

Asistencia. Muchas gracias.

ACTUALIZADO - SOLUCIONADO Ok, está trabajando ahora gracias a dkamins y zneak. Utilicé el método floor() (supongo que no estaba haciendo algo bien en el pasado). Sin embargo, ahora sucede lo siguiente:

p.

(0,86 * 30) + 9)/40 = 0,87 (debería), sin embargo, después TRUNCAR it = 0,86

¿Cómo se truncar 0,87 a 0,86? No tiene sentido. ¿Hay alguna manera de hacer que trunque solo si hay más de dos decimales?

resuelto:

$numDecPlace = strlen(substr(strrchr($newRel, "."), 1)); 
echo '<p>Test: Number of decimal places=' .$numDecPlace. '</p>'; 
if($numDecPlace > 2) { 
    $newRel = floor($newRel * 100)/100; // Truncate to 2dp. 
    echo '<p>Test: New relationship truncated is $newRel=' .$newRel. '</p>'; 
} 
+0

Resolvió mi actualización. – leokennedy

+0

Debería consultar @Fernando Prieto [su respuesta a continuación] (http://stackoverflow.com/a/19124167/1890400). Utiliza un enfoque basado en (sub) cadenas que es similar a la primera parte de la solución elegida, pero personalmente creo que podría ser más eficiente y más robusto. – Byson

Respuesta

4

puede utilizar la función de PHP floor junto con algunos decimal desplazando de este modo:

floor(0.7666666667 * 100)/100; 
+3

Y si le parece feo, puede hacer una capa delgada alrededor de él: 'function trunc ($ number, $ places) {$ power = pow (10, $ places); piso de regreso ($ number * $ power)/$ power; } ' – zneak

+0

Ok, esto es demasiado.Parece que está funcionando ahora (típico). He usado el piso estándar (num * 100)/100 y la función (gracias zneak) y ambos funcionan muy bien y obtengo mi 0.76. Muchas gracias. Sin embargo, tengo un seguimiento, ver arriba :) – leokennedy

2

¿qué tal round()

<?php 
    echo round(3.4);   // 3 
    echo round(3.5);   // 4 
    echo round(3.6);   // 4 
    echo round(3.6, 0);  // 4 
    echo round(1.95583, 2); // 1.96 
    echo round(1241757, -3); // 1242000 
    echo round(5.045, 2); // 5.05 
    echo round(5.055, 2); // 5.06 
    ?> 
4

dado todas las respuestas aquí alrededor del num ber. Esta función funcionó para mí y espero para ti también.

function truncate($number, $decimals) 
{ 
    $point_index = strrpos($number, '.'); 
    return substr($number, 0, $point_index + $decimals+ 1); 
} 

Dónde $number es el número para truncar y $decimals es el número de decimales que desea. Ejemplo:truncate(-38.59540719940386 , 6); vuelve -38.595407

Si lo desea, consulte la documentación substr 's!

+0

Me gusta esta función por varias razones: es claro, fácil de entender cómo funciona exactamente, no hay magia difícil de entender. Además, es bastante eficiente y sabes 100% seguro de que no se introducirán extraños errores de redondeo. – Byson

+0

Esta función funciona incorrectamente con flotadores en forma expotencial ("2.5E7", por ejemplo. "Además, para números flotantes negativos muy pequeños, devuelve cadenas como "-0.0000000". –

0

Utilicé la función round() mencionada por Kartikey. Puede encontrar más información aquí en PHP.Net

float round (float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]) 

Fissh

+0

No parece haber un modo para "hacia cero", por lo que no se puede usar. – CoDEmanX

1

Para ello precisa para ambos + ve y números -ve que necesita el uso:
- la función de php para floor() + ve números
- la función php ceil() para los números -ve

function truncate_float($number, $decimals) { 
    $power = pow(10, $decimals); 
    if($number > 0){ 
     return floor($number * $power)/$power; 
    } else { 
     return ceil($number * $power)/$power; 
    } 
} 

la razón para esto es que floor() siempre redondea el número abajo, no hacia cero.
es decir floor() rondas eficazmente números -ve hacia un valor absoluto mayor
por ejemplo floor(1.5) = 1 mientras floor(-1.5) = 2

Por lo tanto para el método truncado usando multiply by power, round, then divide by power:
- floor() sólo funciona para números positivos
- ceil() sólo funciona para números negativos

Para probar esto, copie el siguiente código en el editor de http://phpfiddle.org/lite (o similar):

<div>Php Truncate Function</div> 
<br> 
<?php 
    function truncate_float($number, $places) { 
     $power = pow(10, $places); 
     if($number > 0){ 
      return floor($number * $power)/$power; 
     } else { 
      return ceil($number * $power)/$power; 
     } 
    } 

    // demo 
    $lat = 52.4884; 
    $lng = -1.88651; 
    $lat_tr = truncate_float($lat, 3); 
    $lng_tr = truncate_float($lng, 3); 
    echo 'lat = ' . $lat . '<br>'; 
    echo 'lat truncated = ' . $lat_tr . '<br>'; 
    echo 'lat = ' . $lng . '<br>'; 
    echo 'lat truncated = ' . $lng_tr . '<br><br>'; 

    // demo of floor() on negatives 
    echo 'floor (1.5) = ' . floor(1.5) . '<br>'; 
    echo 'floor (-1.5) = ' . floor(-1.5) . '<br>'; 
?>