Как заставить number_format () не округлять числа вверх

У меня есть это число:

$double = '21.188624'; 

После использования number_format($double, 2, ',', ' ') я получаю:

 21,19 

Но я хочу:

 21,18 

Любые идеи, как я могу это сделать?

Спасибо.

number_format всегда будет делать это, ваше единственное решение – это что-то другое:

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

Или:

 $number = floor(($number*100))/100; 
 floor($double*100)/100 

Я знаю, что это старый вопрос, но он по-прежнему актуальный :).

Как насчет этой функции?

 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; } 

Применение:

 // 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 

Я использую эту функцию:

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

floor($num) – целочисленная часть, а $num-floor($num) – десятичная (например, 0.2345).

Итак, substr($num-floor($num),1,$precision+1) получает «.23» (обратите внимание, что точка также взята).

Примеры использования:

 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!) 
  **Number without round** $double = '21.188624'; echo intval($double).'.'.substr(end(explode('.',$double)),0,2); **Output** 21.18 

используйте эту функцию:

 function number_format_unlimited_precision($number,$decimal = '.') { $broken_number = explode($decimal,$number); return number_format($broken_number[0]).$decimal.$broken_number[1]); } 
 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; } 
 $finalCommishParts = explode('.',$commission); $commisshSuffix = (isset($finalCommishParts[1])?substr($finalCommishParts[1],0,2):'00'); $finalCommish = $finalCommishParts[0].'.'.$commisshSuffix; 

Если вы не заботитесь о том, что стоит за десятичной точкой, вы можете использовать float как int чтобы избежать округления:

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

В случае, если вы имеете небольшие значения float вы можете использовать функцию number_format таким образом.

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

В случае, если у вас есть длинный десятичный номер, тогда он будет форматировать номер таким образом

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

Используйте встроенную функцию 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 } 

См. Этот ответ для получения более подробной информации.