แสดงจำนวนทศนิยมสองตำแหน่ง


571

วิธีที่ถูกต้องในการปัดเศษสตริง PHP เป็นทศนิยมสองตำแหน่งคืออะไร

$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
รอบ () จะดีกว่าสำหรับการอ่านและความเรียบง่ายเช่นกัน แต่สำหรับสิ่งที่สำคัญโปรดทราบว่ามันเป็นรถราคาถูก
StringsOnFire

40
@ ÁlvaroG.Vicario roundไม่สามารถแก้ปัญหา OP ได้ที่นี่ round("520", 2)ส่งกลับค่า float 520และ echoing ซึ่งแน่นอนว่าจะไม่แสดงเป็นทศนิยม 2 ตำแหน่ง สำหรับวัตถุประสงค์ของ OP - แสดงจำนวนเต็มถึงทศนิยม 2 ตำแหน่งด้วยการเติมด้วยศูนย์ต่อท้าย - คุณต้องใช้ฟังก์ชันการจัดรูปแบบตัวเลขไม่ใช่ฟังก์ชันการปัดเศษ
Mark Amery

3
คำตอบอื่น ๆ ทั้งหมดจะถูก จำกัด ด้วยค่าทศนิยมพร้อมเครื่องหมายจุด เมื่อคุณต้องการได้รับ520,00แทน520.00สิ่งนี้จะได้ผล
SPRBRN

1
ถ้าคุณต้องการ จำกัด เพียงลอย แต่ไม่ int แล้ว bcdiv ($ number, 1,2)
Wasim A.

2
ฉันคิดว่าคุณควรใช้ bcadd (0, $ yournumber, 2) มันจะให้ผลลัพธ์ที่สมบูรณ์แบบ
jewelhuq

213

ใช้round()(ใช้ถ้าคุณคาดหวังว่าตัวเลขในรูปแบบลอยเท่านั้นมิฉะนั้นใช้ number_format () เป็นคำตอบที่ Codemwnci ให้ ):

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.00 ไม่ใช่ 520 ไม่อยากเชื่อเลยว่า round จะไม่ทำตามค่าเริ่มต้น
Claudiu Creanga

2
มันไม่ได้ตอบ OP อย่างถูกต้อง แต่มีมากกว่า 100 โหวตขึ้นไป!
Rob Sedgwick

200

อีกวิธีหนึ่งคือ

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

3
แล้วถ้าคุณต้องการ520,00อะไร ฉันเดาว่าคำตอบอื่น ๆ จะทำงานได้ดีกว่าในกรณีนั้น
SPRBRN

2
^ ไม่มีคำตอบอื่น ๆ ที่จะไม่ให้ทศนิยมสองตำแหน่งสำหรับ int
pythonian29033

1
เหตุผลอื่นที่คุณอาจต้องการนี่คือคุณไม่ต้องการปัดเศษ ... หรือในสาเหตุของ SQL Floats ที่ส่งคืนจะไม่ได้รับการจัดการเหมือนกับ
Float

34

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

เช่น

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

การปัดเศษจะทำหน้าที่การทำงานที่แน่นอนที่ Rich ต้องการ แต่ number_format () จะน่าสนใจยิ่งขึ้นในการค้นหาการจัดรูปแบบตัวเลขทุกชนิด
Shamim Hafiz

วิธีนี้จะทำการปัดเศษและบังคับให้ใช้ตัวเลข ".00" ในตอนท้าย
SystemX17

10
ฉันพยายามปัดเศษ แต่ไม่ได้ผล - จะไม่เพิ่มพิเศษอีก
Rich Bradshaw

ลองใช้หนึ่งในตัวอย่างที่ฉันมีอยู่ก็เป็นของตัวเองในสคริปต์ PHP คุณควรได้รับผลการแสดงความคิดเห็น ถ้าไม่เช่นนั้นคุณมีปัญหากับการติดตั้ง PHP ของคุณที่ไหนสักแห่ง
SystemX17

1
ปัดเศษ (520, 2) ส่งคืน 520, ไม่ใช่ 520.00 ตามที่กำหนดโดย @Rich
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

อีกวิธีที่แปลกใหม่มากขึ้นในการแก้ปัญหานี้คือการใช้bcadd()ที่มีค่าหุ่นสำหรับ $ right_operand 0ของ

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

2
โปรดทราบว่าbc*ฟังก์ชั่นไม่ได้ปัดเศษ ตัวอย่างเช่นให้bcadd("1.0999","0.0",1)ผลตอบแทน "1.0" ไม่ใช่ "1.1"
ColinM

1
ฟังก์ชั่น BC Math จริง ๆ แล้วเพียงหยุดการประมวลผลที่$scaleเลขเศษส่วน นี่เท่ากับการปัดเศษเป็นศูนย์
อาลี



7

round_to_2dp เป็นฟังก์ชั่นที่ผู้ใช้กำหนดและไม่สามารถทำอะไรได้เลยเว้นแต่คุณจะโพสต์ประกาศของฟังก์ชั่นนั้น

อย่างไรก็ตามฉันเดาว่าจะทำสิ่งนี้: number_format($number, 2);


14
จากย่อหน้าแรกของคุณฉันคิดว่าคุณเข้าใจผิดคำถาม round_to_2dp($number);มีความหมายเหมือน pseudocode; OP กำลังขอให้ใครสักคนบอกเขาว่าจะแทนที่นิพจน์นั้นด้วยอะไร
Mark Amery

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

จะแสดงตัวเลขสองหลักหลังจุดทศนิยม

ความได้เปรียบ:

หากคุณต้องการที่จะแสดงตัวเลขสองหลักหลังค่าลอยเท่านั้นและไม่ได้สำหรับ int แล้วใช้สิ่งนี้


นี่เป็นทางออกที่เป็นสากลมากที่สุดหากคุณมี bcdiv (เป็นสต็อค แต่ไม่ใช่แพ็คเกจเริ่มต้นบน centos6)
Shovas

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

การปัดเศษอย่างถูกต้องปัดเศษตัวเลขและ sprintf บังคับให้ทศนิยม 2 ตำแหน่งหากเกิดขึ้นเป็นเพียงทศนิยม 1 ตำแหน่งหลังจากการปัดเศษ


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
ยินดีที่ได้เห็นคณิตศาสตร์บางอย่างที่จำเป็นในการทำเช่นนี้ แม้ว่าการใช้ฟังก์ชั่นในตัวจะเป็นที่ต้องการสำหรับฉัน ไม่มีจุดประดิษฐ์ล้ออีกครั้ง
Lightbulb1

1
ขออภัย แต่ round () ตามที่ระบุไว้ว่า round de number และบางครั้งฉันไม่ต้องการปัดเศษ
joanlgr

5

ที่นี่ฉันได้รับทศนิยมสองตำแหน่งหลังจาก.(จุด) โดยใช้ฟังก์ชัน ...

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 ความหมายการปัดเศษจะเกิดขึ้น ระวัง!
Boaz Rymland

4

หากคุณต้องการใช้ทศนิยมสองหลักในโครงการทั้งหมดของคุณคุณสามารถกำหนด:

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 () จะเพิ่มตัวคั่นหลักพัน

หากต้องการลบสิ่งนี้ให้ทำสิ่งนี้:

$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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.