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

355

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

$number = "520"; // It a string from a DB

$formatted_number = round_to_2dp($number);

echo $formatted_number;

Выход: "520,00";

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

  • 6
    Это действительно не «округление». Округление снижает точность. Это не добавит десятичные знаки к числу, у которого их нет. Основываясь на многих ответах и комментариях, кажется, что люди думают, что округление - это то, чем оно не является. round - это математическая функция, а это проблема форматирования.
Теги:
number-formatting
numbers
rounding
formatting

18 ответов

717
Лучший ответ

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

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

Пример:

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

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

  • 3
    round () будет лучше, так как он удобен для чтения и простоты, но для всего важного следует помнить, что он содержит ошибки
  • 31
    @ ÁlvaroG.Vicario round не решает проблему Ор здесь. round("520", 2) возвращает число с плавающей запятой 520 , и эхо, которое, конечно, не покажет его с точностью до 2 десятичных знаков. Для целей ОП - показа целого числа до 2 десятичных знаков путем заполнения его конечными нулями - вам нужна функция форматирования чисел, а не функция округления.
Показать ещё 4 комментария
151

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

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
  • 2
    Так что, если вы хотите 520,00 ? Я думаю, что другой ответ работает лучше в этом случае.
  • 2
    ^ нет другой ответ не даст два десятичных знака для int
Показать ещё 1 комментарий
101

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

echo round(520.34345,2);    // 520.34

echo round(520, 2);         // 520

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

Описание:

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

Возвращает округленное значение val к указанному 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
?>
  • 1
    @khuderm round($number, 2); не работает Я хочу 520,00, а не 520. Не могу поверить, что раунд не делает этого по умолчанию.
19

Try:

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

Выход будет:

1,234,545,454.00
  • 0
    Это работает, но на выходе будет строка, а не число.
  • 0
    Просто добавьте + к number_format .
Показать ещё 1 комментарий
14

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

например.

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06
  • 0
    Round будет выполнять именно ту функциональность, которую хочет Rich, но для number_format () было бы интереснее рассмотреть все виды числового форматирования.
  • 0
    Этот метод также будет выполнять округление, просто заставляя цифры ".00" на конце.
Показать ещё 3 комментария
8

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

6

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

пример с sprintf:

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

Вы можете работать без echo, ex: sprintf("%.3f",$num);

выход:

2.120

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

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

выход:

2.124 
5

Я делаю свой собственный.

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

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

Однако, моя догадка делает это number_format($number,2);

  • 11
    Из вашего первого абзаца, я думаю, вы неправильно поняли вопрос. round_to_2dp($number); имел в виду псевдокод; ОП просил кого-то сказать ему, чем заменить это выражение.
3

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

$formatted_number = bcadd($number, 0, 2);
  • 1
    Обратите внимание, что функции bc* не округляются вверх, они всегда округляются вниз. Например, bcadd("1.0999","0.0",1) выдает "1.0", а не "1.1".
3
bcdiv($number, 1, 2) //2 varies for digits after decimal

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

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

  • 0
    Это наиболее универсальное решение, если у вас есть bcdiv (это стандартный, но не стандартный пакет на centos6).
3
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

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

  • 0
    Нет, не будет. Я не знаю, когда был написан этот пост, но если вы попробуете его на своем собственном примере, по крайней мере, на моей машине :-), он выдаст 520.90. Смысл, округление будет происходить. Быть осторожен!
3
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

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

2
$twoDecNum = sprintf('%0.2f', round($number, 2));

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

1

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

bcscale(2);

Затем следующая функция даст желаемый результат

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

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

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

Узнать больше

1

Число без раунда

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

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

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

Вы можете использовать функцию 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
  • 3
    -1; в этом ответе нет ничего нового, что в ответе Сомнат Мулук еще не было 2 года назад.
  • 1
    Это также неправильно, как отмечено в моем комментарии к ответу Сомнатха.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню