小数点以下2桁まで数値を表示する


571

PHP文字列を小数点以下2桁に丸める正しい方法は何ですか?

$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もちろんエコーして小数点以下2桁まで表示しません。OPの目的-整数を小数点以下2桁まで後続ゼロで埋めることを示すために-丸め関数ではなく、数値フォーマット関数が必要です。
Mark Amery 2014年

3
他のすべての回答は、ドット表記の10進数値に制限されています。の520,00代わりに取得する必要がある場合520.00、これは単に機能します。
SPRBRN 2014年

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負またはゼロにすることもできます(デフォルト)。

...

例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ではなく520.00が必要です。デフォルトでは、ラウンドがそれを行わないとは信じられません。
Claudiu Creanga

2
OPに正解することすらできませんが、100票以上の投票があります。
ロブセジウィック

200

または、

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

3
それで、あなたが望むならどう520,00ですか?その場合、他の答えがうまく機能すると思います。
SPRBRN 2014

2
^いいえ、他の答えはintの小数点以下2桁を示しません
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

Roundは、Richが望んでいる正確な機能を実行しますが、number_format()は、あらゆる種類の数値フォーマットを調べる方が興味深いでしょう。
Shamim Hafiz、2010

このメソッドは、最後に数字「.00」を強制するだけでなく、丸めも実行します。
SystemX17 2010

10
試してみましたが、機能しません-.00は追加されません。
リッチブラッドショー

私がそこに持っている例の1つを使用してみてください。それは、それ自体がPHPスクリプト内にあります。コメント付きの結果が得られるはずです。そうでない場合は、PHPの設定に問題があります。
SystemX17

1
round(520、2)は、@ Richが要求する520.00ではなく520を返します
user761100

25

試してください:

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

出力は次のようになります。

1,234,545,454.00

2
これは機能しますが、出力は数値ではなく文字列になります。
イーサン

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

この問題を解決するもう1つのエキゾチックな方法bcadd()は、$ right_operandのダミー値を使用することです0

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

2
bc*関数は切り上げないことに注意してください。常に切り捨てられます。たとえば、bcadd("1.0999","0.0",1)「1.1」ではなく「1.0」になります。
ColinM

1
BC Math関数は、実際には$scale小数桁で処理を停止します。これは、ゼロに向かって丸めることと同じです。
アリ



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

これにより、小数点以下2桁が表示されます。

利点:

float値の後にのみ2桁を表示し、intには表示しない場合は、これを使用します。


bcdivがある場合、これは最も一般的なソリューションです(centos6の在庫ですが、デフォルト以外のパッケージです)。
Shovas

7

round_to_2dp はユーザー定義関数であり、その関数の宣言を投稿しない限り、何もできません。

しかし、私の推測ではこれを行っています: number_format($number, 2);


14
最初の段落から、質問を誤解したと思います。round_to_2dp($number);疑似コードとして意図された。OPは、その表現を何に置き換えるかを誰かに指示するように求めていました。
Mark Amery 2013年

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

丸めによって数値が正しく丸められ、sprintfは、丸めた後の桁数がたまたま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()、それが言うように、de numberを丸めます。丸めたくない場合もあります。
joanlgr 2013

5

ここでは.、関数を使用して(ドット)の後に小数点以下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

4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

これにより、小数点以下2桁の数値が得られます。


4
いいえ、ありません。この投稿がいつ作成されたかはわかりませんが、少なくとも私のマシンで独自の例を試してみると、520.90が出力されます。つまり、丸めが発生します。注意してください!
ボアズリムランド

4

プロジェクト全体で2桁の10進数を使用する場合は、以下を定義できます。

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

number_format()はデフォルトで3桁区切りを追加するため、他の回答に追加します。

これを削除するには、次のようにします。

$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; この答えは、Somnath Mulukの答えが2年前にまだ含んでいなかったという新しいことを何も追加しません。
Mark Amery

1
Somnathの回答に関する私のコメントで述べたように、それも間違っています。
Mark Amery 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.