Tampilkan angka ke dua tempat desimal


571

Apa cara yang benar untuk membulatkan string PHP ke dua tempat desimal?

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

$formatted_number = round_to_2dp($number);

echo $formatted_number;

Outputnya harus 520.00;

Bagaimana seharusnya round_to_2dp()definisi fungsinya?


13
Ini sebenarnya bukan "pembulatan". Pembulatan mengurangi presisi. Itu tidak akan menambahkan tempat desimal ke nomor yang tidak memilikinya. Berdasarkan banyak jawaban dan komentar, sepertinya orang berpikir bahwa pembulatan adalah sesuatu yang bukan. roundadalah fungsi matematika, dan ini hanya masalah pemformatan.
Jangan Panik

Jawaban:


1131

Anda dapat menggunakan number_format () :

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

Contoh:

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

Fungsi ini mengembalikan string .


4
round () akan lebih baik untuk keterbacaan dan kesederhanaannya juga, tetapi untuk hal-hal penting, ketahuilah bahwa buggy itu diketahui
bermasalah

40
@ ÁlvaroG.Vicario roundtidak menyelesaikan masalah OP di sini. round("520", 2)mengembalikan float 520, dan gema yang tentu saja tidak akan menunjukkannya ke 2 tempat desimal. Untuk tujuan OP - menunjukkan bilangan bulat ke 2 tempat desimal dengan menambahkannya dengan angka nol - Anda memerlukan fungsi pemformatan angka, bukan fungsi pembulatan.
Mark Amery

3
Semua jawaban lain terbatas pada nilai desimal dengan notasi titik. Ketika Anda perlu mendapatkan 520,00alih-alih 520.00, ini hanya berfungsi.
SPRBRN

1
jika Anda ingin membatasi hanya float tetapi tidak int maka bcdiv ($ number, 1,2)
Wasim A.

2
Saya pikir Anda harus menggunakan bcadd (0, $ yournumber, 2) itu akan memberi Anda hasil yang sempurna.
jewelhuq

214

Gunakan round()(gunakan jika Anda mengharapkan angka dalam format float saja, kalau tidak gunakan number_format () sebagai jawaban yang diberikan oleh Codemwnci ):

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

Dari manual:

Deskripsi:

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

Mengembalikan nilai bulat dari valke yang ditentukan precision(jumlah digit setelah titik desimal). precisionbisa juga negatif atau nol (standar).

...

Contoh # 1 round()contoh

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

Contoh mode contoh # 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);tidak bekerja. Saya ingin 520,00 bukan 520. Tidak percaya putaran tidak melakukan itu secara default.
Claudiu Creanga

2
Bahkan tidak menjawab OP dengan benar tetapi memiliki lebih dari 100 suara!
Rob Sedgwick

200

Kalau tidak,

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

3
Jadi bagaimana jika Anda mau 520,00? Saya kira jawaban lain berfungsi lebih baik dalam hal ini.
SPRBRN

2
^ tidak ada jawaban lain tidak akan memberikan dua tempat desimal untuk int
pythonian29033

1
alasan lain Anda mungkin ingin ini adalah Anda tidak ingin pembulatan ... atau dalam penyebab saya SQL floats kembali tidak diperlakukan sama dengan floats normal yang merupakan bug matematika PHP
Amb3rL4nn

34

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

misalnya

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

Round akan melakukan fungsi persis seperti yang diinginkan Rich, tetapi number_format () akan lebih menarik untuk melihat semua jenis pemformatan numerik.
Shamim Hafiz

Metode ini akan melakukan pembulatan sekaligus hanya dengan memaksa angka "0,00" pada akhirnya.
SystemX17

10
Saya sudah mencoba, tetapi tidak berhasil - itu tidak akan menambah 0,00 ekstra.
Rich Bradshaw

Coba gunakan salah satu contoh yang saya miliki di sana, itu sendiri dalam skrip PHP. Anda harus mendapatkan hasil komentar. Jika tidak, maka Anda memiliki masalah dengan pengaturan PHP Anda di suatu tempat.
SystemX17

1
round (520, 2) mengembalikan 520, bukan 520.00 seperti yang disyaratkan oleh @ Rich
user761100

25

Mencoba:

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

Outputnya adalah:

1,234,545,454.00

2
Itu bekerja, tetapi output akan menjadi string dan bukan angka.
Ethan

1
jika Anda ingin menggunakan number_format setidaknya buatlah itu number_format ($ number, 2, '.', '')
Mihai P.

14

Anda dapat menggunakan PHP printfatau sprintffungsinya:

Contoh dengan sprintf:

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

Anda dapat menjalankan hal yang sama tanpa echo. Contoh:sprintf("%.3f", $num);

Keluaran:

2.120

Atau, dengan printf:

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

Keluaran:

2.124

12

Cara lain yang lebih eksotis untuk menyelesaikan masalah ini adalah menggunakan bcadd()dengan nilai dummy untuk $ right_operand of 0.

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

2
Perhatikan bahwa bc*fungsi tidak bulat, mereka selalu bulat. Misalnya, bcadd("1.0999","0.0",1)menghasilkan "1.0", bukan "1.1".
ColinM

1
Fungsi BC Math sebenarnya hanya berhenti memproses pada $scaleangka fraksional. Ini sama dengan pembulatan ke nol.
Ali



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

Ini akan menampilkan tepat dua digit setelah titik desimal.

Keuntungan:

Jika Anda ingin menampilkan dua digit setelah nilai float saja dan bukan untuk int, maka gunakan ini.


Ini adalah solusi paling universal jika Anda memiliki bcdiv (ini adalah paket tetapi non-default pada centos6).
Shovas

7

round_to_2dp adalah fungsi yang ditentukan pengguna, dan tidak ada yang bisa dilakukan kecuali Anda memposting deklarasi fungsi itu.

Namun, tebakan saya melakukan ini: number_format($number, 2);


14
Dari paragraf pertama Anda, saya pikir Anda telah salah memahami pertanyaan itu. round_to_2dp($number);dimaksudkan sebagai kodesemu; OP meminta seseorang untuk memberi tahu dia apa yang akan menggantikan ekspresi itu.
Mark Amery

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

Pembulatan dengan benar membulatkan angka dan sprintf memaksanya ke 2 tempat desimal jika kebetulan hanya 1 tempat desimal setelah pembulatan.


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

Ini akan mengembalikan 5.98 tanpa membulatkan angka.


Hanya ini yang juga dapat melakukan pekerjaan floor($retailPrice * 100) / 100;tidak perlu format angka kemudian.
Suatu hari,

6

Untuk pembulatan bersyarat yaitu. perlihatkan desimal di mana itu benar-benar diperlukan jika bukan bilangan bulat

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

Saya membuat sendiri.

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

1
Sangat menyenangkan melihat beberapa matematika yang diperlukan untuk melakukan ini. Meskipun menggunakan fungsi bawaan lebih disukai bagi saya. Tidak ada gunanya menciptakan kembali roda.
Lightbulb1

1
Maaf, tetapi bulat (), seperti yang tertulis, angka bulat, dan kadang-kadang, saya tidak ingin bulat.
joanlgr

5

Di sini saya mendapatkan dua desimal setelah .(titik) menggunakan fungsi ...

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;
}

Hasil dari fungsi di atas:

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

Jawaban Benar Baru

Gunakan fungsi PHP asli 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

Ini akan memberi Anda 2 angka setelah desimal.


4
Tidak, tidak akan. Saya tidak tahu kapan posting ini ditulis tetapi jika Anda mencobanya dengan contoh Anda sendiri, setidaknya di komputer saya :-), itu akan menghasilkan 520,90. Artinya, Pembulatan AKAN terjadi. Hati-hati!
Boaz Rymland

4

Jika Anda ingin menggunakan dua digit desimal di seluruh proyek Anda, Anda dapat menentukan:

bcscale(2);

Maka fungsi berikut akan menghasilkan hasil yang Anda inginkan:

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

Tetapi jika Anda tidak menggunakan fungsi bcscale, Anda perlu menulis kode sebagai berikut untuk mendapatkan hasil yang Anda inginkan.

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

Untuk mengetahui lebih lanjut


2

Angka tanpa putaran

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

1

Berikut solusi lain dengan strtok dan str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')

0

Menambahkan ke jawaban lain, karena number_format () akan, secara default, menambahkan ribuan pemisah.

Untuk menghapus ini, lakukan ini:

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

0
  • Pilih jumlah desimal
  • Memformat koma (,)
  • Pilihan untuk memangkas angka nol

Sekali dan untuk semua!

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;
}

Contohnya

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

Anda dapat menggunakan fungsi 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; jawaban ini menambahkan tidak ada yang baru bahwa jawaban Somnath Muluk belum mengandung 2 tahun sebelumnya.
Mark Amery

1
Itu juga salah, sebagaimana dicatat dalam komentar saya tentang jawaban Somnath.
Mark Amery
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.