Javascript: ปัดเศษขึ้นเป็นผลคูณถัดไปของ 5


115

ฉันต้องการฟังก์ชันยูทิลิตี้ที่รับค่าจำนวนเต็ม (มีความยาวตั้งแต่ 2 ถึง 5 หลัก) ซึ่งจะปัดเศษขึ้นเป็นตัวคูณถัดไปของ 5 แทนที่จะเป็นตัวคูณที่ใกล้ที่สุดของ 5 นี่คือสิ่งที่ฉันได้รับ:

function round5(x)
{
    return (x % 5) >= 2.5 ? parseInt(x / 5) * 5 + 5 : parseInt(x / 5) * 5;
}

เมื่อฉันวิ่งround5(32)มันให้ฉัน30โดยที่ฉันต้องการ 35
เมื่อฉันวิ่งround5(37)มันให้ฉัน35ที่ฉันต้องการ 40

เมื่อฉันวิ่งround5(132)มันให้ฉัน130ที่ฉันต้องการ 135
เมื่อฉันวิ่งround5(137)มันให้ฉัน135ที่ฉันต้องการ 140

ฯลฯ ...

ฉันต้องทำอย่างไร


3
ควรround5(5)ให้ 5 หรือ 10?
user2357112 รองรับ Monica

1
วิธีการ: หาร x ด้วย 5 ปัดเศษขึ้นเป็นจำนวนเต็มที่ใกล้ที่สุด (โดยใช้ฟังก์ชัน Math.ceil) แล้วคูณด้วย 5?
Martin Wilson

2
รอบ 5 (5) ควรให้ 5
Amit Erandole

คำตอบ:


275

สิ่งนี้จะทำงาน:

function round5(x)
{
    return Math.ceil(x/5)*5;
}

มันเป็นเพียงรูปแบบของการปัดเศษทั่วไปnumberไปยังxฟังก์ชันพหุคูณที่ใกล้ที่สุดMath.round(number/x)*xแต่การใช้.ceilแทนที่จะ.roundทำให้ปัดเศษขึ้นแทนที่จะเป็นลง / ขึ้นตามกฎทางคณิตศาสตร์


คุณช่วยอธิบายเล็กน้อยเกี่ยวกับวิธีที่คุณมาถึงโซลูชันนี้ได้อย่างรวดเร็ว? ฉันคิดว่า Math.ceil จะปัดเศษทศนิยมให้เป็นจำนวนเต็มเท่านั้น
Amit Erandole

2
มันปัดเศษขึ้นเป็นจำนวนเต็มทั้งหมดที่นี่ @AmitErandole;)
Michael Krelin - แฮ็กเกอร์

1
+1 สำหรับขนาดกะทัดรัดและมีประสิทธิภาพ ... และจะปัดเศษเป็น 10 ใช่ไหม? :)
zx81

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

3
ฉันชอบวิธีนี้! ฉันใช้มันด้วยการปิดเพื่อความสะดวกในการเปลี่ยนอินไลน์หลายรายการตามต้องการ: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mการใช้งาน:roundToNearestMultipleOf(5)(32)
gfullam

12
const roundToNearest5 = x => Math.round(x/5)*5

นี้จะปัดเศษจำนวนที่ใกล้ที่สุด 5. รอบเสมอถึงที่ใกล้ที่สุด 5 Math.ceilใช้ ในทำนองเดียวกันในการปัดเศษลงให้ใช้Math.floorแทนMath.round. จากนั้นคุณสามารถเรียกใช้ฟังก์ชันนี้เหมือนกับที่คุณเรียกใช้ ตัวอย่างเช่น,

roundToNearest5(21)

จะกลับมา:

20

คำตอบที่ยอมรับนั้นผิดจริง นี่คือวิธีที่ถูกต้อง ใช้ได้กับทศนิยมเช่น 2.5
Oliver Dixon


5

ฉันมาถึงที่นี่ในขณะที่ค้นหาสิ่งที่คล้ายกัน ถ้าตัวเลขของฉันคือ --0, --1, --2 มันควรจะอยู่ที่ --0 และถ้าเป็น --3, --4, - 5 ก็ควรจะอยู่ที่ -5

ฉันคิดวิธีแก้ปัญหานี้:

function round(x) { return x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5 }

และการทดสอบ:

for (var x=40; x<51; x++) {
  console.log(x+"=>", x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5)
}
// 40 => 40
// 41 => 40
// 42 => 40
// 43 => 45
// 44 => 45
// 45 => 45
// 46 => 45
// 47 => 45
// 48 => 50
// 49 => 50
// 50 => 50

1
สิ่งนี้สามารถทำได้ง่ายขึ้นโดยใช้Math.round
Spencer Stolworthy

2
voici 2 solutions possibles :
y= (x % 10==0) ? x : x-x%5 +5; //......... 15 => 20 ; 37 => 40 ;  41 => 45 ; 20 => 20 ; 

z= (x % 5==0) ? x : x-x%5 +5;  //......... 15 => 15 ; 37 => 40 ;  41 => 45 ; 20 => 20 ;

ขอแสดงความนับถือพอล


0

// ปัดเศษด้วยความแม่นยำ

var round = function (value, precision) {
    return Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision);
};

// ปัดเศษเป็น 5 ด้วยความแม่นยำ

var round5 = (value, precision) => {
    return round(value * 2, precision) / 2;
}

0
const fn = _num =>{
    return Math.round(_num)+ (5 -(Math.round(_num)%5))
}

เหตุผลในการใช้รอบคืออินพุตที่คาดไว้อาจเป็นตัวเลขสุ่ม

ขอบคุณ !!!


-2
if( x % 5 == 0 ) {
    return int( Math.floor( x / 5 ) ) * 5;
} else {
    return ( int( Math.floor( x / 5 ) ) * 5 ) + 5;
}

อาจจะ?


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