У меня есть это число:
$double = '21.188624';
После использования number_format($double, 2, ',', ' ')
я получаю:
21,19
Но я хочу:
21,18
Любые идеи, как я могу это сделать?
Спасибо.
У меня есть это число:
$double = '21.188624';
После использования number_format($double, 2, ',', ' ')
я получаю:
21,19
Но я хочу:
21,18
Любые идеи, как я могу это сделать?
Спасибо.
number_format
всегда будет делать это, ваше единственное решение - это что-то другое:
$number = intval(($number*100))/100;
Или:
$number = floor(($number*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
floor($double*100)/100
Я использую эту функцию:
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]);
}
$finalCommishParts = explode('.',$commission);
$commisshSuffix = (isset($finalCommishParts[1])?substr($finalCommishParts[1],0,2):'00');
$finalCommish = $finalCommishParts[0].'.'.$commisshSuffix;
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;
}
Если вы не заботитесь о том, что стоит за десятичной точкой, вы можете использовать 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
}
Подробнее см. этот ответ.