У меня есть это число:
$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 }
См. Этот ответ для получения более подробной информации.