Подтвердить что ты не робот

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

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

$double = '21.188624';

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

21,19

Но я хочу:

21,18

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

Спасибо.

4b9b3361

Ответ 1

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

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

Или:

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

Ответ 2

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

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

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

Ответ 3

floor($double*100)/100

Ответ 4

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

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!)

Ответ 5

 **Number without round**        

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

**Output** 21.18

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

$number = 21.23;

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

Если у вас есть длинное десятичное число, то оно также будет форматировать номер

$number = 201541.23;

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

Ответ 11

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

Подробнее см. этот ответ.