จะปัดเศษขึ้นเป็น 10 ที่ใกล้ที่สุดได้อย่างไร


100

เราจะปัดเศษตัวเลขให้เป็น 10 ที่ใกล้ที่สุดใน php ได้อย่างไร?

สมมติว่าฉันมี23รหัสอะไรฉันจะใช้เพื่อปัดเศษเพื่อ30?


51
เอ่อนั่นไม่ใช่10 ที่ใกล้ที่สุด ?
Rowland Shaw

1
ตกลงปัดเศษขึ้น 1 ตัวเลขสำคัญแล้ว! haha
tarnfeld

3
เพื่อความเป็นธรรมในชื่อเรื่องระบุว่า "ปัดเศษขึ้นเป็น 10 ที่ใกล้ที่สุด" แม้ว่าข้อความจะระบุว่า "ปัดเศษ" ... ฉันค่อนข้างแน่ใจว่าเขาขอให้ปัดเศษขึ้นเป็น10 ตัวถัดไปเสมอ
แอรอน Wallentine

1
ปัดเศษขึ้นเป็น 10 stackoverflow.com/q/43932648/6521116
Kris Roofe

คำตอบ:


221

floor() จะลงไป

ceil() จะขึ้น.

round() จะไปที่ใกล้ที่สุดโดยค่าเริ่มต้น

หารด้วย 10 ทำ ceil แล้วคูณด้วย 10 เพื่อลดเลขนัยสำคัญ

$number = ceil($input / 10) * 10;

แก้ไข: ฉันทำแบบนี้มานานแล้ว .. แต่คำตอบของ TallGreenTree นั้นสะอาดกว่า


4
คำตอบของ TallGreenTree ไม่ได้ปัดเศษขึ้นเสมอไป คำตอบนี้ถูกต้องที่สุดเมื่อใช้ ceil ()
Brandon

1
คำตอบของ TallGreenTree รองรับการปัดเศษขึ้น / ลงโดยใช้พารามิเตอร์ที่สาม (โหมด) ของ round () รอบ ($ input, -1, PHP_ROUND_HALF_UP)
Daren Schwenke

4
@DarenSchwenke พารามิเตอร์ตัวที่สามนั้นไม่ทำงานอย่างที่คุณคิดซึ่งจะควบคุมเฉพาะกรณีที่อยู่กึ่งกลางระหว่างช่วงเวลาเท่านั้น (15,-1, PHP_ROUND_HALF_UP); // 20,(14,-1, PHP_ROUND_HALF_UP); // 10
อาทิตย์

170
round($number, -1);

ซึ่งจะปัดเศษ $ number ให้ใกล้เคียงที่สุด 10 คุณยังสามารถส่งผ่านตัวแปรที่สามได้หากจำเป็นเพื่อเปลี่ยนโหมดการปัดเศษ

ข้อมูลเพิ่มเติมที่นี่: http://php.net/manual/en/function.round.php


11
คุณสามารถตำหนิพวกเขาที่สมมติว่าผู้ถามหมายถึง "ปัดเศษเป็น 10 ที่ใกล้ที่สุด" เมื่อคำถามกล่าวว่า "ปัดเศษเป็น 10 ที่ใกล้ที่สุด" สองครั้ง
ceejayoz

คำตอบนี้ถูกโพสต์ก่อนที่ผู้ถามจะชี้แจงตัวเอง ฉันเพิ่งคิดว่าเขาปัดเศษในคำถามไม่ถูกต้อง
Will Barrett

12
TallGreenTree ถูกต้อง คุณสามารถตั้งค่าโหมดการปัดเศษด้วยอาร์กิวเมนต์ที่ 3: "โหมดหนึ่งใน PHP_ROUND_HALF_UP, PHP_ROUND_HALF_DOWN, PHP_ROUND_HALF_EVEN หรือ PHP_ROUND_HALF_ODD"
d -_- b

13
สิ่งนี้ไม่ได้ให้ผลลัพธ์ที่ถูกต้อง 23จะเป็น20และไม่ใช่30เพราะมันจะวิ่งไปใกล้ที่สุด 10 เสมอโหมดการปัดเศษจะไม่ช่วยเนื่องจากรอบนี้เพียงครึ่งเดียวหลังจากที่x..
Timo002

1
น่าเสียดายที่ ceil () และ floor () ยังไม่มีพารามิเตอร์ความแม่นยำ
squarecandy

15

จริงๆแล้วฉันกำลังค้นหาฟังก์ชันที่สามารถปัดเศษเป็นตัวแปรที่ใกล้ที่สุดและหน้านี้ยังคงปรากฏในการค้นหาของฉัน ดังนั้นในที่สุดเมื่อฉันเขียนฟังก์ชันด้วยตัวเองฉันคิดว่าฉันจะโพสต์ไว้ที่นี่เพื่อให้คนอื่นค้นหา

ฟังก์ชันจะปัดเศษเป็นตัวแปรที่ใกล้ที่สุด:

function roundToTheNearestAnything($value, $roundTo)
{
    $mod = $value%$roundTo;
    return $value+($mod<($roundTo/2)?-$mod:$roundTo-$mod);
}

รหัสนี้:

echo roundToTheNearestAnything(1234, 10).'<br>';
echo roundToTheNearestAnything(1234, 5).'<br>';
echo roundToTheNearestAnything(1234, 15).'<br>';
echo roundToTheNearestAnything(1234, 167).'<br>';

จะส่งออก:

1230
1235
1230
1169

Kenny คุณดีที่สุด ฉันเพียงหวังว่าฉันจะมีการแสดงภาพกราฟิกว่ามันกลมอย่างไรดังนั้นฉันแน่ใจว่ามันให้ผลลัพธ์ที่คาดหวังใน 100% ของกรณี ฉันเดาว่าฉันต้องทำการทดสอบบางอย่าง
Slava

มีวิธีใดในการแก้ไขโค้ดนี้เพื่อเพิ่มพารามิเตอร์ตัวที่สามด้วยโหมดกลม HALF_UP / HALF_DOWN
Slava

12

มีคำถามมากมายในคำถามนี้อาจทั้งหมดจะให้คำตอบที่คุณกำลังมองหา แต่ตามที่ @TallGreenTree กล่าวถึงมีฟังก์ชันนี้

แต่ปัญหาของคำตอบของ @TallGreenTree คือมันไม่ปัดเศษขึ้นมันจะปัดเศษเป็น 10 ที่ใกล้ที่สุดในการแก้ปัญหานี้ให้เพิ่ม+5หมายเลขของคุณเพื่อปัดเศษขึ้น หากต้องการปัดเศษลงให้ทำ-5หากคุณต้องการที่จะลงรอบทำ

ดังนั้นในรหัส:

round($num + 5, -1);

คุณไม่สามารถใช้ไฟล์ round modeสำหรับการปัดเศษได้เนื่องจากจะปัดเศษเศษส่วนเท่านั้นไม่ใช่จำนวนเต็ม

หากคุณต้องการที่จะรอบขึ้นไปที่ใกล้ที่สุด100คุณ shoud +50ใช้


สิ่งนี้ใช้ไม่ได้กับตัวเลขที่ไม่ใช่ทศนิยม 10 กลายเป็น 20
Luciano



2

เราสามารถ "โกง" ผ่านรอบด้วย

$rounded = round($roundee / 10) * 10;

นอกจากนี้เรายังสามารถหลีกเลี่ยงการแบ่งจุดลอยได้ด้วย

function roundToTen($roundee)
{
  $r = $roundee % 10;
  return ($r <= 5) : $roundee - $r : $roundee + (10 - $r);
}

แก้ไข: ฉันไม่รู้ (และยังไม่ได้รับการบันทึกไว้อย่างดีในไซต์) ว่าroundตอนนี้รองรับความแม่นยำ "เชิงลบ" แล้วดังนั้นคุณจึงสามารถใช้

$round = round($roundee, -1);

แก้ไขอีกครั้ง: หากคุณต้องการปัดเศษคุณสามารถลองได้

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}

สวัสดีมันทำงานได้อย่างสมบูรณ์แบบ - สำหรับคำถามนั้นฉันจะปัดเศษได้อย่างไร 23 ถึง 30?
tarnfeld



0

แรงกระตุ้นแรกของฉันคือ Google สำหรับ "php math" และฉันค้นพบว่ามีฟังก์ชันห้องสมุดคณิตศาสตร์หลักที่เรียกว่า "round ()" ซึ่งน่าจะเป็นสิ่งที่คุณต้องการ


0

สำหรับคนที่ต้องการทำด้วย SQL ดิบโดยไม่ต้องใช้ php, java, python เป็นต้น SET SQL_SAFE_UPDATES = 0; UPDATE db.table SET value=ceil(value/10)*10 where value not like '%0';


0

ฉันต้องการปัดเศษขึ้นเป็นตัวเลขถัดไปในตำแหน่งหลักที่ใหญ่ที่สุด (มีชื่อนี้หรือไม่) ดังนั้นฉันจึงสร้างฟังก์ชันต่อไปนี้ (ใน php):

//Get the max value to use in a graph scale axis, 
//given the max value in the graph
function getMaxScale($maxVal) {
    $maxInt = ceil($maxVal);
    $numDigits = strlen((string)$maxInt)-1; //this makes 2150->3000 instead of 10000
    $dividend = pow(10,$numDigits);
    $maxScale= ceil($maxInt/ $dividend) * $dividend;
    return $maxScale;
}

0
Hey i modify Kenny answer and custom it not always round function now it can be ceil and floor function

function roundToTheNearestAnything($value, $roundTo,$type='round')
    {
        $mod = $value%$roundTo;
        if($type=='round'){
            return $value+($mod<($roundTo/2)?-$mod:$roundTo-$mod);
        }elseif($type=='floor'){
            return $value+($mod<($roundTo/2)?-$mod:-$mod);
        }elseif($type=='ceil'){
            return $value+($mod<($roundTo/2)?$roundTo-$mod:$roundTo-$mod);
        }

    }

echo roundToTheNearestAnything(1872,25,'floor'); // 1850<br>
echo roundToTheNearestAnything(1872,25,'ceil'); // 1875<br>
echo roundToTheNearestAnything(1872,25,'round'); // 1875

0

สามารถทำได้อย่างง่ายดายโดยใช้ฟังก์ชัน PHP ' fmod ' รหัสด้านล่างเป็นรหัสเฉพาะสำหรับ 10 แต่คุณสามารถเปลี่ยนเป็นตัวเลขใดก็ได้

$num=97;
$r=fmod($num,10);
$r=10-$r;
$r=$num+$r;
return $r;

เอาท์พุท: 100



-2

ลองทำตามนี้ ...... ส่งผ่านในหมายเลขที่จะปัดเศษและมันจะปัดเศษเป็นสิบที่ใกล้ที่สุดหวังว่ามันจะช่วย ....

รอบ ($ num, 1);

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