Javascript ปัดเศษเป็น 0.5 ที่ใกล้ที่สุด


100


ใครช่วยบอกหน่อยได้ไหมว่าฉันจะปัดเศษตัวเลขให้เป็น 0.5 ที่ใกล้ที่สุดได้อย่างไร
ฉันต้องปรับขนาดองค์ประกอบในหน้าเว็บตามความละเอียดหน้าจอและด้วยเหตุนี้ฉันจึงสามารถกำหนดขนาดตัวอักษรใน pts เป็น 1, 1.5 หรือ 2 เป็นต้นไปเป็นต้น

ถ้าฉันปัดเศษมันจะปัดเศษเป็นทศนิยม 1 ตำแหน่งหรือไม่มีเลย ฉันจะทำงานนี้ให้สำเร็จได้อย่างไร?

คำตอบ:


194

เขียนฟังก์ชันของคุณเองโดยคูณด้วย 2 ปัดเศษแล้วหารด้วย 2 เช่น

function roundHalf(num) {
    return Math.round(num*2)/2;
}

เพิ่งใช้สิ่งนี้เพื่อล้างฟังก์ชันลดค่าเงินที่กลับมาพร้อมกับจุดทศนิยม 9 จุด ... (num * 100) / 100 ทำงานได้อย่างสมบูรณ์
Dustin Kreidler

หากคุณต้องการลงท้ายด้วย 13.0 หรือ 13.5 ฉันรวมคำตอบของคุณกับคำตอบด้านล่าง: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D

การปัดเศษ num * 2 ใช้ไม่ได้กับทุกกรณีลองใช้ทศนิยมเช่น 15.27 => โดยใช้สูตรของคุณจะให้ => 15 ซึ่งในความเป็นจริงควรส่งกลับ 15.5 **** ฉันคิดว่าใช้ toFixed จะดีกว่า (num * 2) .toFixed () / 2
sfdx bomb

@sfdxbomb คุณตรวจสอบสิ่งนี้แล้วหรือยัง? ในคอนโซลของเบราว์เซอร์ของฉันroundHalf(15.27)ส่งคืน 15.5
malarres

83

นี่คือวิธีแก้ปัญหาทั่วไปที่อาจเป็นประโยชน์สำหรับคุณ:

function round(value, step) {
    step || (step = 1.0);
    var inv = 1.0 / step;
    return Math.round(value * inv) / inv;
}

round(2.74, 0.1) = 2.7

round(2.74, 0.25) = 2.75

round(2.74, 0.5) = 2.5

round(2.74, 1.0) = 3.0


1
อะไรinvหมายถึง? อะไรคือinvตัวแปรหมายถึง?
Deilan

1
@Deilan inverseฉันเดา
Alex K

3

ในการขยายคำตอบด้านบนโดย newtron สำหรับการปัดเศษมากกว่า 0.5

function roundByNum(num, rounder) {
    var multiplier = 1/(rounder||0.5);
    return Math.round(num*multiplier)/multiplier;
}

console.log(roundByNum(74.67)); //expected output 74.5
console.log(roundByNum(74.67, 0.25)); //expected output 74.75
console.log(roundByNum(74.67, 4)); //expected output 76


2

Math.round(-0.5)ส่งคืน0แต่ควรเป็น-1ตามกฎคณิตศาสตร์

ข้อมูลเพิ่มเติม: Math.round () และNumber.prototype.toFixed ()

function round(number) {
    var value = (number * 2).toFixed() / 2;
    return value;
}

1
@ ยูริหากต้องการขยายสิ่งที่คุณกำลังพูดให้roundปัดเศษเป็นจำนวนเต็มถัดไปที่มากกว่าค่าที่กำหนดซึ่งในแง่ของจำนวนลบจะเป็นไปตามสเปกตรัมจำนวนเต็มบวก -2.5 จะไปที่ -2 ถูกต้องหรือไม่
Danny Bullis

เพิ่งได้รับการยืนยัน Math.ceil(-1.75) == -1และMath.floor(-1.75) == -2. ดังนั้นสำหรับใครก็ตามที่สะดุดด้วยสิ่งนี้ให้คิดว่ามันเป็นceilผลตอบแทนที่มากกว่าตัวเลขfloorส่งกลับน้อยกว่าตัวเลข
Danny Bullis

2

เพียงแค่คำตอบข้างต้นทั้งหมดที่ถูกถอดออก:

Math.round(valueToRound / 0.5) * 0.5;

ทั่วไป:

Math.round(valueToRound / step) * step;

1
    function roundToTheHalfDollar(inputValue){
      var percentile = Math.round((Math.round(inputValue*Math.pow(10,2))/Math.pow(10,2)-parseFloat(Math.trunc(inputValue)))*100)
      var outputValue = (0.5 * (percentile >= 25 ? 1 : 0)) + (0.5 * (percentile >= 75 ? 1 : 0))
      return Math.trunc(inputValue) + outputValue
    }

ฉันเขียนสิ่งนี้ก่อนที่จะเห็นการตอบสนองที่ดีขึ้นของ Tunaki;)


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