Показать число до двух десятичных знаков

572

Как правильно округлить строку PHP до двух десятичных знаков?

$number = "520"; // It's a string from a database

$formatted_number = round_to_2dp($number);

echo $formatted_number;

Выход должен быть 520.00;

Каким должно round_to_2dp()быть определение функции?

Рич Брэдшоу
источник
13
Это действительно не «округление». Округление снижает точность. Это не добавит десятичные знаки к числу, у которого их нет. Основываясь на многих ответах и ​​комментариях, кажется, что люди думают, что округление - это то, чем оно не является. roundэто математическая функция, и это просто проблема форматирования.
Не паникуйте

Ответы:

1132

Вы можете использовать number_format () :

return number_format((float)$number, 2, '.', '');

Пример:

$foo = "105";
echo number_format((float)$foo, 2, '.', '');  // Outputs -> 105.00

Эта функция возвращает строку .

Codemwnci
источник
4
Функция round () была бы лучше для ее читабельности и простоты, но для чего-то критического следует помнить, что она известна как глючная
StringsOnFire
40
@ ÁlvaroG. Викарио roundне решает проблему ОП здесь. round("520", 2)возвращает число с плавающей запятой 520и повторение, которое, конечно, не будет отображать его с точностью до 2 десятичных знаков Для целей ОП - показа целого числа до 2 десятичных знаков путем заполнения его конечными нулями - вам нужна функция форматирования чисел, а не функция округления.
Марк Амери
3
Все остальные ответы ограничены десятичными значениями с точечной нотацией. Когда вам нужно получить 520,00вместо этого 520.00, это просто работает.
СПРБРН
1
если вы хотите ограничить только float, но не int, тогда bcdiv ($ number, 1,2)
Wasim A.
2
Я думаю, что вы должны использовать bcadd (0, $ yournumber, 2), это даст вам идеальный результат.
jewelhuq
214

Используйте round()(используйте, если вы ожидаете число только в формате с плавающей запятой, иначе используйте number_format () в качестве ответа от Codemwnci ):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520

Из руководства:

Описание:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);

Возвращает округленное значение valдо указанного precision(количество цифр после десятичной точки). precisionтакже может быть отрицательным или нулевым (по умолчанию).

...

Пример # 1 round()примеры

<?php
    echo round(3.4);         // 3
    echo round(3.5);         // 4
    echo round(3.6);         // 4
    echo round(3.6, 0);      // 4
    echo round(1.95583, 2);  // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2);    // 5.05
    echo round(5.055, 2);    // 5.06
?>

Пример # 2 примеры режима

<?php
    echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
    echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
    echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
    echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

    echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
    echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9
?>
Сомнат Мулук
источник
5
@khuderm round($number, 2);не работает. Я хочу 520,00, а не 520. Не могу поверить, что раунд не делает этого по умолчанию.
Клавдиу Крянгэ,
2
Он даже не отвечает на ОП правильно, но имеет более 100 голосов!
Роб Седжвик
200

С другой стороны,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
Марк Б
источник
3
Так что, если вы хотите 520,00? Я думаю, что другой ответ работает лучше в этом случае.
СПРБР
2
^ нет другой ответ не даст два десятичных знака для int
pythonian29033
1
другие причины, по которым вы можете захотеть, это то, что вы не хотите округлять ... или в моем случае возвращаемые значения с плавающей точкой SQL не обрабатываются так же, как обычные значения с плавающей точкой, что является математической ошибкой PHP
Amb3rL4nn
34

http://php.net/manual/en/function.round.php

например

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06
SystemX17
источник
Round будет выполнять именно ту функциональность, которую хочет Rich, но для number_format () было бы интереснее рассмотреть все виды числового форматирования.
Шамим Хафиз
Этот метод также будет выполнять округление, просто заставляя цифры «.00» на конце.
SystemX17
10
Я попробовал, но это не сработало - это не добавит лишних .00.
Рич Брэдшоу
Попробуйте использовать один из примеров, которые у меня есть, он сам по себе в сценарии PHP. Вы должны получить закомментированный результат. Если нет, то у вас есть проблемы с настройкой PHP где-то.
SystemX17
1
Раунд (520, 2) возвращает 520, а не 520,00, как того требует @Rich
user761100
25

Пытаться:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 

Выход будет:

1,234,545,454.00
Biju
источник
2
Это работает, но на выходе будет строка, а не число.
Итан
1
если вы хотите использовать number_format, по крайней мере, сделайте его number_format ($ number, 2, '.', '')
Михай П.
14

Вы можете использовать PHP printfилиsprintf функции:

Пример с sprintf:

$num = 2.12;
echo sprintf("%.3f", $num);

Вы можете запустить то же самое без echo так же. Пример:sprintf("%.3f", $num);

Вывод:

2.120

В качестве альтернативы, с printf:

echo printf("%.2f", $num);

Вывод:

2.124
Адитья П Бхатт
источник
12

Другим более экзотическим способом решения этой проблемы является использование bcadd()фиктивного значения для $ right_operand of 0.

$formatted_number = bcadd($number, 0, 2);
powtac
источник
2
Обратите внимание, что bc*функции не округляются вверх, они всегда округляются вниз. Например, bcadd("1.0999","0.0",1)выдает «1.0», а не «1.1».
ColinM
1
Математические функции BC на самом деле просто останавливают обработку на $scaleдробных цифрах. Это равно округлению до нуля.
Али
11

Используйте PHP number_format ()функцию .

Например,

$num = 7234545423;
echo number_format($num, 2);

Выход будет:

7,234,545,423.00
Сани Камаль
источник
8
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

Это будет отображать ровно две цифры после десятичной точки.

Преимущество:

Если вы хотите отображать две цифры только после значения с плавающей запятой, а не для int, используйте это.

Васим А.
источник
Это наиболее универсальное решение, если у вас есть bcdiv (это стандартный, но не стандартный пакет на centos6).
Шовас
7

round_to_2dp является определяемой пользователем функцией, и ничего нельзя сделать, если вы не опубликовали объявление этой функции.

Тем не менее, я думаю, что делает это: number_format($number, 2);

ajreal
источник
14
Из вашего первого абзаца, я думаю, вы неправильно поняли вопрос. round_to_2dp($number);имел в виду псевдокод; ОП просил кого-то сказать ему, чем заменить это выражение.
Марк Амери
6
$twoDecNum = sprintf('%0.2f', round($number, 2));

Округление правильно округляет число, и sprintf принудительно округляет его до 2 десятичных разрядов, если после округления оно составляет всего 1 десятичный знак.

JohnS
источник
6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

Он вернет 5.98 без округления числа.

mrphpguru
источник
Только это также может сделать работу floor($retailPrice * 100) / 100;без необходимости числового формата.
Сомсгод
6

Для условного округления т.е. показать десятичное число, где это действительно нужно, иначе целое число

123,56 => 12,56

123,00 => 123

$somenumber = 123.56;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123.56


$somenumber = 123.00;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123    
Viney
источник
6

Я делаю свое.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
joanlgr
источник
1
Приятно видеть некоторые математики, необходимые для этого. Хотя использование встроенной функции для меня предпочтительнее. Нет смысла заново изобретать колесо.
Lightbulb1
1
Извините, но round (), как говорится, round de number, а иногда я не хочу округлять.
joanlgr
5

Здесь я получаю два знака после .(точки), используя функцию ...

function truncate_number($number, $precision = 2) {

    // Zero causes issues, and no need to truncate
    if (0 == (int)$number) {
        return $number;
    }

    // Are we negative?
    $negative = $number / abs($number);

    // Cast the number to a positive to solve rounding
    $number = abs($number);

    // Calculate precision number for dividing / multiplying
    $precision = pow(10, $precision);

    // Run the math, re-applying the negative value to ensure
    // returns correctly negative / positive
    return floor( $number * $precision ) / $precision * $negative;
}

Результаты от вышеупомянутой функции:

echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789);    // 2.56
echo truncate_number(2.56789, 3); // 2.567

echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789);    // -2.56
echo truncate_number(-2.56789, 3); // -2.567

Новый правильный ответ

Используйте нативную функцию PHP bcdiv

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 2);  // 2.56
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567
Мистер Х.К.
источник
4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Это даст вам 2 числа после десятичного числа.

Скопион Сэм
источник
4
Нет, не будет. Я не знаю, когда был написан этот пост, но если вы попробуете его на своем собственном примере, по крайней мере, на моей машине :-), он выдаст 520.90. Смысл, округление будет происходить. Быть осторожен!
Боаз Римланд
4

Если вы хотите использовать две десятичные цифры во всем вашем проекте, вы можете определить:

bcscale(2);

Тогда следующая функция выдаст желаемый результат:

$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11

Но если вы не используете функцию bcscale, вам нужно написать следующий код, чтобы получить желаемый результат.

$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11

Знать больше

jewelhuq
источник
2

Номер без тура

$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Абхишек Шарма
источник
1

Вот еще одно решение с помощью strtok и str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Bryan
источник
0

Добавление к другим ответам, так как number_format (), по умолчанию, добавит разделитель тысяч.

Чтобы удалить это, сделайте это:

$number = number_format($number, 2, ".", "");
Иван Ивкович
источник
0
  • Выберите количество десятичных знаков
  • Формат запятых (,)
  • Возможность обрезать конечные нули

Однажды и на всегда!

function format_number($number,$dec=0,$trim=false){
  if($trim){
    $parts = explode(".",(round($number,$dec) * 1));
    $dec = isset($parts[1]) ? strlen($parts[1]) : 0;
  }
  $formatted = number_format($number,$dec); 
  return $formatted;
}

Примеры

echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2);      //returns 1,234.50
echo format_number(1234.5);        //returns 1,235
Карима
источник
-6

Вы можете использовать PHP round () .

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06
Sadikhasan
источник
3
-1; в этом ответе нет ничего нового, что в ответе Сомнат Мулук не было 2 года назад.
Марк Амери
1
Это также неправильно, как отмечено в моем комментарии к ответу Сомнатха.
Марк Амери