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?

Bradshaw yang kaya
sumber
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 .

Codemwnci
sumber
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
?>
Somnath Muluk
sumber
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
Marc B
sumber
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
SystemX17
sumber
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
Biju
sumber
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
Aditya P Bhatt
sumber
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);
powtac
sumber
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
11

Gunakan fungsi PHP number_format () .

Sebagai contoh,

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

Outputnya adalah:

7,234,545,423.00
Sani Kamal
sumber
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.

Wasim A.
sumber
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);

nyata
sumber
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.

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

Ini akan mengembalikan 5.98 tanpa membulatkan angka.

mrphpguru
sumber
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    
Viney
sumber
6

Saya membuat sendiri.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
joanlgr
sumber
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
Tuan HK
sumber
4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Ini akan memberi Anda 2 angka setelah desimal.

S'copion Sam
sumber
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

permata
sumber
2

Angka tanpa putaran

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

Berikut solusi lain dengan strtok dan str_pad :

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

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

Untuk menghapus ini, lakukan ini:

$number = number_format($number, 2, ".", "");
Ivan Ivković
sumber
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
Kareem
sumber
-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
Sadikhasan
sumber
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