İki ondalık basamağa sayı göster


571

Bir PHP dizesini iki ondalık basamağa yuvarlamanın doğru yolu nedir?

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

$formatted_number = round_to_2dp($number);

echo $formatted_number;

Çıktı 520.00;

round_to_2dp()İşlev tanımı nasıl olmalı ?


13
Bu gerçekten "yuvarlama" değil. Yuvarlama hassasiyeti azaltır . Kendisine sahip olmayan bir sayıya ondalık basamak eklemez. Cevapların ve yorumların çoğuna dayanarak, insanlar yuvarlamanın olmadığı bir şey olduğunu düşünüyor gibi görünüyor. roundbir matematik fonksiyonudur ve bu sadece bir biçimlendirme problemidir.
Panik yapmayın

Yanıtlar:


1131

Number_format () kullanabilirsiniz :

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

Misal:

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

Bu işlev bir dize döndürür .


4
round (), okunabilirliği ve sadeliği için de daha iyi olurdu, ancak kritik bir şey için buggy olduğu bilindiğini
unutmayın

40
@ ÁlvaroG.Vicario roundburada OP'nin problemini çözmüyor. round("520", 2)şamandırayı döndürür ve 520elbette 2 ondalık basamağa göstermeyecek yankılama. OP'nin amacı için - sondaki sıfırlarla doldurmak suretiyle 2 ondalık basamağa bir tamsayıyı göstermek için - bir yuvarlama işlevine değil, bir sayı biçimlendirme işlevine ihtiyacınız vardır.
Mark Amery

3
Diğer tüm cevaplar nokta göstergeli ondalık değerlerle sınırlıdır. 520,00Bunun yerine almanız gerektiğinde 520.00, bu basitçe işe yarar.
SPRBRN

1
sadece float sınırlamak istiyorsanız, ancak int değil bcdiv ($ sayı, 1,2)
Wasim A.

2
Bence bcadd kullanmalısınız (0, $ numaranız, 2) size mükemmel sonuç verecektir.
jewelhuq

213

Kullan round()(yalnızca float biçiminde bir sayı bekliyorsanız kullanın, aksi takdirde Codemwnci tarafından verilen bir cevap olarak number_format () kullanın ):

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

Kılavuzdan:

Açıklama:

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

Yuvarlak değerini verir valbelirtilen için precision(noktadan sonraki basamak sayısı). precisionnegatif veya sıfır da olabilir (varsayılan).

...

Örnek 1 - round()Örnekler

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

Örnek 2 - mod örnekleri

<?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);çalışmıyor. 520.00 değil 520.00 istiyorum. Tur varsayılan olarak bunu yapmaz inanamıyorum.
Claudiu Creanga

2
OP'ye doğru cevap vermez, ancak 100'den fazla oyu vardır!
Rob Sedgwick

200

Alternatif olarak,

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

3
Peki ya istersen 520,00? Bu durumda diğer cevap daha iyi çalışıyor sanırım.
SPRBRN

2
^ hayır diğer cevap bir int için iki ondalık basamak vermeyecektir
pythonian29033

1
başka bir neden bu yuvarlama istemiyorum ... ya da benim
nedenimde

34

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

Örneğin

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

Round, Rich'in istediği kesin işlevselliği yapacak, ancak number_format () her türlü sayısal biçimlendirmeyi aramak için daha ilginç olacaktır.
Shamim Hafiz

Bu yöntem yalnızca ".00" rakamlarını zorlayarak yuvarlamayı gerçekleştirecektir.
SystemX17

10
Ben tur denedim, ama işe yaramaz - ekstra .00 eklemez.
Rich Bradshaw

Ben orada bir örnek, bir PHP komut dosyası kendi kullanmayı deneyin. Yorumlanan sonucu almalısınız. Değilse, PHP kurulumunuzda bir yerde bir sorununuz var.
SystemX17

1
round (520, 2) @Rich tarafından istendiği gibi 520.00 değil 520 döndürür
user761100

25

Deneyin:

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

Çıktı şöyle olacaktır:

1,234,545,454.00

2
Bu işe yarar, ancak çıktı bir sayı değil bir dize olur.
Ethan

1
number_format kullanmak istiyorsanız en azından number_format yapın ($ number, 2, '.', '')
Mihai P.

14

PHP printfveya sprintfişlevleri kullanabilirsiniz :

İle örnek sprintf:

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

Aynı şeyi da olmadan yapabilirsiniz echo. Misal:sprintf("%.3f", $num);

Çıktı:

2.120

Alternatif olarak printf:

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

Çıktı:

2.124

12

Bu sorunu çözmenin daha egzotik bir yolu bcadd()da $ right_operand of için kukla bir değer kullanmaktır 0.

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

2
Not olduğu bc*fonksiyonlar yuvarlak yukarıya değil, hep yuvarlak aşağı. Örneğin, bcadd("1.0999","0.0",1)"1.1" değil "1.0" verir.
ColinM

1
BC Math işlevleri aslında $scalekesirli basamaklarda işlemeyi durdurur . Bu sıfıra yuvarlamaya eşittir.
Ali

11

PHP number_format () işlevini kullanın .

Örneğin,

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

Çıktı şöyle olacaktır:

7,234,545,423.00


7

round_to_2dp kullanıcı tanımlı bir işlevdir ve bu işlevin bildirimini göndermediğiniz sürece hiçbir şey yapılamaz.

Ancak, tahminim bunu yapıyor: number_format($number, 2);


14
İlk paragrafınızdan, soruyu yanlış anladığınızı düşünüyorum. round_to_2dp($number);pseudocode; OP, birinden ona bu ifadenin yerini ne alacağını söylemesini istiyordu.
Mark Amery

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

Bu, ondalık noktadan sonra tam olarak iki basamak görüntüler.

Avantajı:

İnt için değil, yalnızca bir kayan nokta değerinden sonra iki basamak görüntülemek istiyorsanız, bunu kullanın.


Bcdiv'iniz varsa bu en evrensel çözümdür (centos6'da stok ama varsayılan olmayan bir pakettir).
Shovas

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

Yuvarlama, sayıyı doğru şekilde yuvarlar ve sprintf, yuvarlamadan sonra yalnızca 1 ondalık basamak olması durumunda 2 ondalık basamağa zorlar.


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

Sayı yuvarlanmadan 5.98 döndürecektir.


Sadece bu aynı zamanda işi floor($retailPrice * 100) / 100;sayı formatına gerek duymadan yapabilir .
somsgod

6

Koşullu yuvarlama için. gerçekten ihtiyaç duyulan yerde ondalık göster aksi takdirde tam sayı

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

Ben kendiminkini yaparım.

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

1
Bunu yapmak için gerekli bazı matematik görmek güzel. Her ne kadar benim için yerleşik bir işlev kullanmak tercih edilir. Tekerleği yeniden icat etmenin bir anlamı yok.
Lightbulb1

1
Üzgünüm, ama yuvarlak (), dediği gibi, yuvarlak de numarası ve bazen, yuvarlak istemiyorum.
joanlgr

5

Burada .bir işlevi kullanarak (nokta) sonra iki ondalık olsun ...

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

Yukarıdaki fonksiyonun sonuçları:

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

Yeni Doğru Yanıt

PHP yerel işlevini kullanın 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

Bu ondalık sayıdan sonra 2 sayı verecektir.


4
Hayır olmaz. Bu yazının ne zaman yazıldığını bilmiyorum ama kendi örneğinizle denerseniz, en azından makinemde :-), 520.90 çıktı verecektir. Anlamı, Yuvarlama gerçekleşir. Dikkatli ol!
Mart'ta Boaz Rymland

4

Tüm projenizde iki ondalık basamak kullanmak istiyorsanız, aşağıdakileri tanımlayabilirsiniz:

bcscale(2);

Ardından aşağıdaki işlev istediğiniz sonucu verecektir:

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

Ancak bcscale işlevini kullanmazsanız, istediğiniz sonucu elde etmek için kodu aşağıdaki gibi yazmanız gerekir.

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

Daha fazla bilmek


2

Yuvarlak olmayan sayı

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

1

İşte strtok ve str_pad ile başka bir çözüm :

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

0

Diğer yanıtlara ekleme yapıldığından, number_format () varsayılan olarak binlerce ayırıcı ekleyecektir.

Bunu kaldırmak için şunu yapın:

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

0
  • Ondalıkların sayısını seçin
  • Biçim virgül (,)
  • Sondaki sıfırları kırpma seçeneği

Son olarak!

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

Örnekler

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 () işlevini kullanabilirsiniz.

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; bu cevap Somnath Muluk'un cevabının 2 yıl önce içermediği konusunda yeni bir şey eklemiyor.
Mark Amery

1
Somnath'ın cevabı hakkındaki yorumumda belirtildiği gibi, bu da yanlış.
Mark Amery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.