2010-09-30 35 views

Respuesta

20

number_format siempre hará que su única solución es darle de comer algo diferente:

$number = intval(($number*100))/100; 

O:

$number = floor(($number*100))/100; 
+2

Pruebe esto con este número: 0.29, ¡y falla! – Arsham

+0

haga esto: $ finalCommishParts = explotar ('.', $ Commission); $ commisshSuffix = (isset ($ finalCommishParts [1])? Substr ($ finalCommishParts [1], 0,2): '00'); $ finalCommish = $ finalCommishParts [0]. '.'. $ CommisshSuffix; –

+0

@AsafMaoz: tenga cuidado con las diferencias de separador decimal con las configuraciones regionales. – Wrikken

0

uso de esta función:

function number_format_unlimited_precision($number,$decimal = '.') 
{ 
    $broken_number = explode($decimal,$number); 
    return number_format($broken_number[0]).$decimal.$broken_number[1]); 
} 
+0

tiene un extra) $ broken_number [1]); – ddjikic

+1

Esto no hace nada: simplemente devuelve el mismo número de entrada a medida que se pasa (también hay error de ortografía en el corchete). – T30

+0

Sé que es una respuesta antigua y no es una muy buena respuesta, pero aclaremos que hay una edición, y si miran la historia, el bracket extra fue agregado por este tipo de Linus y no por el respondedor original. –

0
$finalCommishParts = explode('.',$commission); 
$commisshSuffix = (isset($finalCommishParts[1])?substr($finalCommishParts[1],0,2):'00'); 
$finalCommish = $finalCommishParts[0].'.'.$commisshSuffix; 
+1

Agregue el texto explicativo. No veo 'number_format (...)' en esta respuesta, por lo que no puedo entender cómo responde a la pregunta "Cómo hacer que number_format() no redondee números" – Sumurai8

+0

Este fragmento hace lo que hace number_format, pero sin redondeando el número. Como se mencionó anteriormente, verifique su separador decimal local. –

0
public function numberFormatPrecision($number, $separator = '.', $format = 2){ 

    $response = ''; 
    $brokenNumber = explode($separator, $number); 
    $response = $brokenNumber[0] . $separator; 
    $brokenBackNumber = str_split($brokenNumber[1]); 

    if($format < count($brokenBackNumber)){ 

     for($i = 1; $i <= $format; $i++) 
      $response .= $brokenBackNumber[$i]; 
    } 

    return $response; 
} 
+0

No puede tener para ($ i = 1; ... porque $ brokenBackNumber [$ i] perderá el primer carácter, ya que $ brokenBackNumber está basado en cero. También debería tener una sección 'else {}' para su sentencia if Pero me gusta tu idea. –

0

En caso de que no se preocupa por lo que viene detrás de la coma decimal, se puede emitir el float como int para evitar el redondeo:

$float = 2.8; 
echo (int) $float; // outputs '2' 
2

utilizo esta función:

function cutNum($num, $precision = 2){ 
    return floor($num).substr($num-floor($num),1,$precision+1); 
} 

floor($num) es la parte entera, y $num-floor($num) es el decimal (como 0.2345).

Entonces substr($num-floor($num),1,$precision+1) obtiene ".23" (tenga en cuenta que el punto también se toma).

ejemplos de uso:

cutNum(1.2345) //returns 1.23 
cutNum(1.2345,3) //returns 1.234 
cutNum(1.2345,10) //returns 1.2345 
cutNum(1.2345,0) //returns 1. (!don't use with zero as second argument: use floor instead!) 
+0

Lo usaste hoy y funcionó como un amuleto – samouray

+0

Me salvaste el tiempo Gracias –

2
**Number without round**   

    $double = '21.188624'; 
    echo intval($double).'.'.substr(end(explode('.',$double)),0,2); 

**Output** 21.18 
8

Sé que esta pregunta un viejo, pero todavía :) real.

¿Qué tal esta función?

function numberFormatPrecision($number, $precision = 2, $separator = '.') 
{ 
    $numberParts = explode($separator, $number); 
    $response = $numberParts[0]; 
    if(count($numberParts)>1){ 
     $response .= $separator; 
     $response .= substr($numberParts[1], 0, $precision); 
    } 
    return $response; 
} 

Uso:

// numbers test 
numberFormatPrecision(19, 2, '.'); // expected 19 return 19 
numberFormatPrecision(19.1, 2, '.'); //expected 19.1 return 19.1 
numberFormatPrecision(19.123456, 2, '.'); //expected 19.12 return 19.12 

// negative numbers test 
numberFormatPrecision(-19, 2, '.'); // expected -19 return -19 
numberFormatPrecision(-19.1, 2, '.'); //expected -19.1 return -19.1 
numberFormatPrecision(-19.123456, 2, '.'); //expected -19.12 return -19.12 

// precision test 
numberFormatPrecision(-19.123456, 4, '.'); //expected -19.1234 return -19.1234 

// separator test 
numberFormatPrecision('-19,123456', 3, ','); //expected -19,123 return -19,123 -- comma separator 
0

en caso de tener pequeñas float valores que se pueden utilizar number_format función de esta manera.

$number = 21.23; 

echo number_format($number, 2, '.', ',')); // 21.23 

En caso de que tenga usted tiene número decimal largo, entonces también será el formato de número de esta manera

$number = 201541.23; 

echo number_format($number, 2, '.', ',')); // 201,541.23 
0

Usar la función nativa de PHP bcdiv.

function numberFormat($number, $decimals = 2, $sep = ".", $k = ","){ 
    $number = bcdiv($number, 1, $decimals); // Truncate decimals without rounding 
    return number_format($number, $decimals, $sep, $k); // Format the number 
} 

Ver this answer para más detalles.

Cuestiones relacionadas