Покажіть число до двох знаків після коми


571

Який правильний спосіб округлити рядок 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є математичною функцією, і це лише проблема форматування.
Не панікуйте

Відповіді:


1131

Ви можете використовувати number_format () :

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

Приклад:

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

Ця функція повертає рядок .


4
round () було б краще і для його читабельності, і для простоти, але для всього критичного слід пам’ятати, що це, як відомо, було баггі
StringsOnFire

40
@ ÁlvaroG.Vicario roundне вирішує тут проблему ОП. round("520", 2)повертає поплавок 520і повторюється, що, звичайно, не відображатиме його до 2 знаків після коми. Для оперативної мети - показ цілого числа до двох знаків після коми, доповнивши її проміжними нулями - потрібна функція форматування чисел, а не функція округлення.
Марк Амері

3
Усі інші відповіді обмежуються десятковими значеннями з крапкою. Коли вам потрібно отримати 520,00замість цього 520.00, це просто працює.
SPRBRN

1
якщо ви хочете обмежити лише float, але не int, тоді bcdiv ($ число, 1,2)
Wasim A.

2
Я думаю, що ви повинні використовувати bcadd (0, $ yournumber, 2), це дасть вам ідеальний результат.
Jewhuq

213

Використовуйте round()(використовуйте, якщо ви очікуєте номер лише у плаваючому форматі, інше використовуйте число_формат () як відповідь, дану 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? Я здогадуюсь, що інша відповідь в цьому випадку працює краще.
SPRBRN

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

Раунд виконає точну функціональність, яку бажає Річ, але було б цікавіше розглянути номер_формату () для всіх типів цифрового форматування.
Шамім Хафіз

Цей метод буде також округленням і над просто придушенням цифр ".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

2
Це працює, але вихід буде рядком, а не числом.
Етан

1
якщо ви хочете використовувати number_format, принаймні зробіть його числом_формату ($ номер, 2, '.', '')
Mihai P.

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 0.

$formatted_number = bcadd($number, 0, 2);

2
Зауважте, що bc*функції не округляються, вони завжди округляються. Наприклад, bcadd("1.0999","0.0",1)урожай "1,0", а не "1,1".
ColinM

1
Функції BC Math фактично просто припиняють обробку $scaleдробовими цифрами. Це дорівнює округленню до нуля.
Алі



7

round_to_2dp є визначеною користувачем функцією, і нічого не можна зробити, якщо ви не опублікували декларацію цієї функції.

Однак, я здогадуюсь цього: number_format($number, 2);


14
З першого пункту, я думаю, ви неправильно зрозуміли питання. round_to_2dp($number);означався псевдокодом; ОП просила когось сказати йому, чим замінити це вираз.
Марк Амері

7
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

Це відображатиме рівно дві цифри після коми.

Перевага:

Якщо ви хочете відобразити дві цифри після значення float, а не для int, використовуйте це.


Це найбільш універсальне рішення, якщо у вас є bcdiv (це запас, але пакет, який не замовчується на centos6).
Шова

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

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


6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

Він повернеться 5,98 без округлення числа.


Тільки це також може виконати роботу, floor($retailPrice * 100) / 100;не потребуючи тоді формату чисел.
somsgod

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    

6

Я роблю своє.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);

1
Приємно бачити деякі математики, необхідні для цього. Хоча використання вбудованої функції для мене є кращим. Немає сенсу повторно винаходити колесо.
Лампочка1

1
Вибачте, але круглий (), як мовиться, круглий номер, а іноді, я не хочу округлювати.
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

Щоб знати більше




0

Додаючи до інших відповідей, оскільки число_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

-5

Ви можете використовувати функцію 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
Це також неправильно, як зазначалося в моєму коментарі до відповіді Сомната.
Марк Амері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.