소수점 이하 두 자리까지 숫자 표시


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는 여기서 OP의 문제를 해결하지 못합니다. round("520", 2)float를 반환하고 520물론 소수점 이하 두 자리까지 표시하지 않는 에코를 반환합니다 . OP의 목적을 위해-후행 0으로 채워서 소수점 이하 2 자리까지 정수를 표시하려면 반올림 함수가 아닌 숫자 서식 함수가 필요합니다.
Mark Amery

3
다른 모든 답변은 점 표기법이있는 10 진수 값으로 제한됩니다. 520,00대신에 가져와야 할 때 520.00간단하게 작동합니다.
SPRBRN

1
float 만 제한하고 int는 제한하지 않으려면 bcdiv ($ number, 1,2)
Wasim A.

2
나는 당신이 bcadd (0, $ yournumber, 2)를 사용해야한다고 생각합니다. 그것은 당신에게 완벽한 결과를 줄 것입니다.
jewelhuq

213

사용하십시오 round()(부동 형식의 숫자 만 예상하는 경우 사용하십시오 . 그렇지 않으면 Codemwnci에서 제공 한 답변 으로 number_format ()을 사용 하십시오 ).

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음수 또는 0 일 수도 있습니다 (기본값).

...

예 # 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);이 작동하지 않습니다. 나는 52520이 아닌 520을 원한다. round는 기본적으로 그렇게하지 않는다고 믿을 수 없다.
Claudiu Creanga

2
OP에 정확하게 대답하지는 않지만 100 표 이상을 획득했습니다!
Rob Sedgwick

200

또는

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00

3
원하는 경우 어떻게해야 520,00합니까? 이 경우 다른 답변이 더 잘 작동한다고 생각합니다.
SPRBRN

2
^ 다른 답변은 정수에 소수점 이하 두 자리를주지 않습니다
pythonian29033

1
당신이 이것을 원할 수도있는 다른 이유는 당신이 반올림을 원하지 않는다는 것입니다 ... 또는 내 원인으로 반환 된 SQL floats는 PHP 수학 버그 인 일반적인 floats와 동일하게 처리되지 않습니다.
Amb3rL4nn

34

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

예 :

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

Round는 Rich가 원하는 정확한 기능을 수행하지만 number_format ()은 모든 종류의 숫자 형식을 조사하는 것이 더 흥미로울 것입니다.
Shamim Hafiz

이 방법은 마지막에 숫자 ".00"을 강제하는 것보다 반올림을 수행합니다.
SystemX17

10
라운드를 시도했지만 작동하지 않습니다-여분의 .00을 추가하지 않습니다.
Rich Bradshaw

내가 가지고있는 예제 중 하나를 사용해보십시오 .PHP 스크립트 자체입니다. 주석 처리 된 결과를 가져와야합니다. 그렇지 않으면 어딘가에 PHP 설정에 문제가있는 것입니다.
SystemX17

1
라운드 ((520), 2) 반환 @ 부자에 의해 요구 (520),하지 520.00
user761100

25

시험:

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

출력은 다음과 같습니다.

1,234,545,454.00

2
작동하지만 출력은 숫자가 아닌 문자열입니다.
Ethan

1
number_format을 사용하려면 최소한 number_format ($ number, 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 of에 더미 값 을 사용 하는 것입니다 0.

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

2
하는 것으로 bc*기능 라운드까지하지, 그들은 항상 내림. 예를 들어, bcadd("1.0999","0.0",1)"1.1"이 아니라 "1.0"을 산출합니다.
ColinM

1
BC 수학 함수는 실제로 $scale소수 자릿수 에서 처리를 중지 합니다. 이것은 0으로 반올림하는 것과 같습니다.
Ali

11

PHP number_format () 함수를 사용하십시오 .

예를 들어

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

출력은 다음과 같습니다.

7,234,545,423.00


7

round_to_2dp 는 사용자 정의 함수이며 해당 함수의 선언을 게시하지 않으면 아무 것도 수행 할 수 없습니다.

그러나 내 추측은 다음과 같습니다. number_format($number, 2);


14
첫 번째 단락에서 나는 당신이 그 질문을 오해했다고 생각합니다. round_to_2dp($number);의사 코드로 사용되었습니다. OP는 누군가에게 그 표현을 대체 할 것을 말해달라고 요청했습니다.
Mark Amery

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

소수점 뒤에 정확히 두 자리 숫자가 표시됩니다.

이점:

int가 아닌 float 값 뒤에 두 자리 숫자를 표시하려면 이것을 사용하십시오.


이것은 bcdiv가있는 경우 가장 보편적 인 솔루션입니다 (centos6의 주식이지만 기본 패키지가 아닙니다).
Shovas

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

반올림은 숫자를 올바르게 반올림하고 반올림 한 후 소수점 이하 1 자리 만 발생하면 스프린트는 소수점 이하 2 자리로 강제합니다.


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
죄송하지만 round ()는 숫자대로, 때로는 반올림하고 싶지 않습니다.
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

더 알고


2

라운드없는 숫자

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


0

number_format ()은 기본적으로 천 단위 구분 기호를 추가하므로 다른 답변에 추가하십시오.

이것을 제거하려면 다음과 같이하십시오 :

$number = number_format($number, 2, ".", "");

0
  • 소수 자릿수 선택
  • 쉼표 형식 (,)
  • 후행 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; 이 답변은 Somnath Muluk의 답변에 아직 2 년 전의 내용이 포함되어 있지 않은 새로운 내용은 없습니다.
Mark Amery

1
Somnath의 답변에 대한 의견에서 언급했듯이 잘못되었습니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.