Hiển thị một số đến hai chữ số thập phân


571

Cách chính xác để làm tròn một chuỗi PHP đến hai chữ số thập phân là gì?

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

$formatted_number = round_to_2dp($number);

echo $formatted_number;

Đầu ra phải là 520.00;

round_to_2dp()Định nghĩa hàm nên như thế nào ?


13
Đây thực sự không phải là "làm tròn". Làm tròn làm giảm độ chính xác. Nó sẽ không thêm vị trí thập phân vào một số không có chúng. Dựa trên nhiều câu trả lời và nhận xét, có vẻ như mọi người đang nghĩ rằng làm tròn là một cái gì đó không phải là nó. roundlà một hàm toán học, và đây chỉ là một vấn đề định dạng.
Đừng hoảng sợ

Câu trả lời:


1131

Bạn có thể sử dụng number_format () :

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

Thí dụ:

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

Hàm này trả về một chuỗi .


4
round () cũng sẽ tốt hơn cho tính dễ đọc và đơn giản của nó, nhưng đối với bất kỳ điều gì quan trọng hãy lưu ý rằng nó đã được biết là có lỗi
StringOnFire

40
@ ÁlvaroG.Vicario roundkhông giải quyết vấn đề của OP ở đây. round("520", 2)trả về số float 520và lặp lại tất nhiên sẽ không hiển thị đến 2 chữ số thập phân. Đối với mục đích của OP - hiển thị một số nguyên đến 2 vị trí thập phân bằng cách đệm nó bằng các số 0 ở cuối - bạn cần một hàm định dạng số, không phải là hàm làm tròn.
Đánh dấu Amery

3
Tất cả các câu trả lời khác được giới hạn ở các giá trị thập phân với ký hiệu dấu chấm. Khi bạn cần nhận được 520,00thay vì 520.00, điều này chỉ đơn giản là làm việc.
XUÂN

1
nếu bạn muốn giới hạn chỉ float nhưng không int thì bcdiv ($ number, 1,2)
Wasim A.

2
Tôi nghĩ bạn nên sử dụng bcadd (0, $ yournumber, 2) nó sẽ cho bạn kết quả hoàn hảo.
jewhuq

213

Sử dụng round()(sử dụng nếu bạn chỉ mong đợi một số ở định dạng float, khác sử dụng number_format () làm câu trả lời được cung cấp bởi Codemwnci ):

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

Từ hướng dẫn:

Sự miêu tả:

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

Trả về giá trị làm tròn của valchỉ định precision(số chữ số sau dấu thập phân). precisioncũng có thể âm hoặc bằng 0 (mặc định).

...

Ví dụ số 1 round()ví dụ

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

Ví dụ chế độ ví dụ # 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);không hoạt động. Tôi muốn 520.00 chứ không phải 520. Không thể tin rằng vòng không làm điều đó theo mặc định.
Claudiu Creanga

2
Nó thậm chí không trả lời đúng OP nhưng có hơn 100 phiếu bầu!
Rob Sedgwick

200

Ngoài ra,

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

3
Vì vậy, nếu bạn muốn 520,00? Tôi đoán câu trả lời khác hoạt động tốt hơn trong trường hợp đó.
XUÂN

2
^ không câu trả lời nào khác sẽ không đưa ra hai chữ số thập phân cho một int
pythonia29033

1
Các lý do khác mà bạn có thể muốn là vì bạn không muốn làm tròn ... hoặc trong lý do của tôi, các phao SQL được trả về không được xử lý giống như các phao thông thường là lỗi toán học PHP
Amb3rL4nn

34

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

ví dụ

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

Round sẽ thực hiện chức năng chính xác mà Rich đang muốn, nhưng number_format () sẽ thú vị hơn khi xem xét tất cả các loại định dạng số.
Shamim Hafiz

Phương pháp này sẽ thực hiện làm tròn cũng như chỉ buộc các chữ số ".00" ở cuối.
SystemX17

10
Tôi đã thử vòng, nhưng nó không hoạt động - nó sẽ không thêm 0,00.
Bradshaw giàu

Hãy thử sử dụng một trong những ví dụ tôi có ở đó, nó tự nó trong tập lệnh PHP. Bạn sẽ nhận được kết quả bình luận. Nếu không thì bạn có một vấn đề với thiết lập PHP của bạn ở đâu đó.
SystemX17

1
vòng (520, 2) trả về 520, không phải 520,00 theo yêu cầu của @Rich
user761100

25

Thử:

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

Đầu ra sẽ là:

1,234,545,454.00

2
Điều đó hoạt động, nhưng đầu ra sẽ là một chuỗi chứ không phải là một số.
Ethan

1
nếu bạn muốn sử dụng number_format ít nhất hãy tạo số number_format ($ number, 2, '.', '')
Mihai P.

14

Bạn có thể sử dụng PHP printfhoặc các sprintfhàm:

Ví dụ với sprintf:

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

Bạn có thể chạy như vậy mà không có echolà tốt. Thí dụ:sprintf("%.3f", $num);

Đầu ra:

2.120

Ngoài ra, với printf:

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

Đầu ra:

2.124

12

Một cách khác kỳ lạ hơn để giải quyết vấn đề này là sử dụng bcadd()với giá trị giả cho $ right_operand của 0.

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

2
Lưu ý rằng các bc*chức năng không làm tròn lên, chúng luôn làm tròn xuống. Ví dụ: bcadd("1.0999","0.0",1)mang lại "1.0", không phải "1.1".
ColinM

1
Các hàm BC Math thực sự chỉ dừng xử lý ở $scalecác chữ số phân số. Điều này tương đương với làm tròn về không.
Ali



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

Điều này sẽ hiển thị chính xác hai chữ số sau dấu thập phân.

Lợi thế:

Nếu bạn muốn hiển thị hai chữ số chỉ sau một giá trị float và không cho int, thì hãy sử dụng cái này.


Đây là giải pháp phổ biến nhất nếu bạn có bcdiv (đó là gói chứng khoán nhưng không mặc định trên centos6).
Shovas

7

round_to_2dp là một hàm do người dùng định nghĩa và không có gì có thể được thực hiện trừ khi bạn đăng phần khai báo của hàm đó.

Tuy nhiên, dự đoán của tôi là làm điều này: number_format($number, 2);


14
Từ đoạn đầu tiên của bạn, tôi nghĩ bạn đã hiểu nhầm câu hỏi. round_to_2dp($number);có nghĩa là mã giả; OP đã yêu cầu ai đó nói cho anh ta biết nên thay thế biểu hiện đó bằng gì.
Đánh dấu Amery

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

Làm tròn chính xác làm tròn số và sprintf buộc nó đến 2 vị trí thập phân nếu nó chỉ là 1 chữ số thập phân sau khi làm tròn.


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

Nó sẽ trả về 5,98 mà không làm tròn số.


Chỉ điều này cũng có thể làm công việc floor($retailPrice * 100) / 100;không cần định dạng số sau đó.
somsgod

6

Đối với làm tròn có điều kiện tức là. hiển thị số thập phân trong đó thực sự cần thiết nếu không toàn bộ số

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

Tôi làm cho riêng mình.

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

1
Thật tuyệt khi thấy một số toán học cần thiết để làm điều này. Mặc dù sử dụng một chức năng tích hợp được ưa thích đối với tôi. Không có điểm nào phát minh lại bánh xe.
Lightbulb1

1
Xin lỗi, nhưng làm tròn (), như đã nói, làm tròn số và đôi khi, tôi không muốn làm tròn.
joanlgr

5

Ở đây tôi nhận được hai số thập phân sau .(dấu chấm) bằng cách sử dụng hàm ...

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

Kết quả từ chức năng trên:

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

Câu trả lời đúng mới

Sử dụng hàm bcdiv của hàm PHP

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

Điều này sẽ cung cấp cho bạn 2 số sau số thập phân.


4
Không, nó sẽ không. Tôi không biết khi nào bài viết này được viết nhưng nếu bạn thử nó với ví dụ của riêng bạn, ít nhất là trên máy của tôi :-), nó sẽ xuất ra 520,90. Ý nghĩa, làm tròn SILL xảy ra. Hãy cẩn thận!
Boaz Rymland 17/03/2016

4

Nếu bạn muốn sử dụng hai chữ số thập phân trong toàn bộ dự án của mình, bạn có thể xác định:

bcscale(2);

Sau đó, chức năng sau đây sẽ tạo ra kết quả mong muốn của bạn:

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

Nhưng nếu bạn không sử dụng hàm bcscale, bạn cần viết mã như sau để có kết quả mong muốn.

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

Để biết thêm chi tiết


2

Số không tròn

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

1

Đây là một giải pháp khác với strtokstr_pad :

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

0

Thêm vào các câu trả lời khác, vì number_format () theo mặc định sẽ thêm hàng ngàn dấu phân cách.

Để loại bỏ điều này, hãy làm điều này:

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

0
  • Chọn số thập phân
  • Định dạng dấu phẩy (,)
  • Một tùy chọn để cắt các số 0 ở cuối

Một lần và mãi mãi!

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

Ví dụ

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

Bạn có thể sử dụng hàm round () của 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

3
-1; câu trả lời này không có gì mới mà câu trả lời của Somnath Muluk đã không có từ 2 năm trước.
Đánh dấu Amery

1
Điều đó cũng sai, như đã lưu ý trong nhận xét của tôi về câu trả lời của Somnath.
Đánh dấu Amery
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.