คุณปัดเศษทศนิยม 1 ตำแหน่งใน Javascript อย่างไร


378

คุณสามารถปัดเศษตัวเลขใน javascript เป็น 1 อักขระหลังจุดทศนิยม (ปัดเศษอย่างเหมาะสม) ได้หรือไม่?

ฉันลอง * 10, กลม, / 10 แต่มันเหลือทศนิยมสองตำแหน่งที่ส่วนท้ายของ int


9
Math.round(n * 10) / 10ทำงานได้ดี รหัสของคุณคืออะไร
Ben Fleming

คำตอบ:


729

Math.round(num * 10) / 10 ทำงานได้นี่เป็นตัวอย่าง ...

var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3

หากคุณต้องการให้มันมีทศนิยมหนึ่งตำแหน่งแม้จะเป็น 0 ให้เพิ่ม ...

var fixed = rounded.toFixed(1)
// fixed is always to 1 d.p.
// NOTE: .toFixed() returns a string!

// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros

// So, just make sure it is the last step before output,
// and use a number format during calculations!

แก้ไข: เพิ่มรอบด้วยฟังก์ชันความแม่นยำ ...

ใช้หลักการนี้สำหรับการอ้างอิงนี่คือฟังก์ชั่นกลมเล็ก ๆ ที่มีประโยชน์ที่ให้ความแม่นยำ ...

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

... การใช้งาน ...

round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7

... ค่าเริ่มต้นคือปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด (ความแม่นยำ 0) ...

round(12345.6789) // 12346

... และสามารถใช้ปัดเศษเป็น 10 หรือ 100 รอบที่ใกล้ที่สุดได้

round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300

... และการจัดการตัวเลขลบที่ถูกต้อง ...

round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5

... และสามารถใช้ร่วมกับ toFixed เพื่อจัดรูปแบบเป็นสตริงได้อย่างต่อเนื่อง ...

round(456.7, 2).toFixed(2) // "456.70"

45
ใช้ความระมัดระวัง.toFixed()เพราะมันจะส่งกลับสตริงเมื่อคุณอาจต้องการตัวเลข
Cobby

1
เจ๋งเห็นได้ชัดว่าการใช้parseFloatจะลบทศนิยมทิ้ง.toFixed()ถ้ามันเป็นจำนวนเต็ม (ศูนย์) โดยทั่วไปหากคุณต้องการทำคณิตศาสตร์ควรทำตามตัวอย่างแรกของคุณ หากคุณต้องการที่จะแสดงจำนวนใน UI .toFixed()ของคุณแล้วใช้
Cobby

อืม ... เหมาะสมแล้วทุกวิธีที่คุณแปลงเป็นตัวเลขจะต้องตัดศูนย์ที่ผิดพลาดออกไปเสมอ ฉันเดาว่ามันควรจะเป็นขั้นตอนสุดท้ายก่อนที่จะแสดงและไม่ได้ใช้ในการคำนวณ
Billy Moon

2
ใช้ความระมัดระวัง.toFixed()เนื่องจากอาจส่งคืนผลลัพธ์การปัดเศษที่แตกต่างกันสำหรับเบราว์เซอร์ที่แตกต่างกัน อ่านโพสต์นี้เพื่อดูรายละเอียดในหัวข้อ!
Wilt

1
ฉันสามารถเพิ่มศูนย์ได้หรือไม่ถ้าไม่มี DP อยู่?
Nick

101
var number = 123.456;

console.log(number.toFixed(1)); // should round to 123.5

4
บางครั้งtoFixed()มีข้อบกพร่อง - ฉันเคยเห็นมันในเบราว์เซอร์ Chrome ที่ฉันโทรtoFixed()แล้วแปลงเป็นสตริงและมันแสดงสิ่งที่10.00000000068แปลกประหลาด ไม่สามารถทำซ้ำได้อย่างน่าเชื่อถือ
Hamish Grubijan

ใช่ฉันพบข้อบกพร่องด้วย toFixed () แม้จะมีเพียงไม่กี่ทศนิยม มันจะปัดเศษเศษส่วน 4 เป็นจำนวนที่สูงกว่าถัดไปแทนที่จะเป็นต่ำกว่า
Dalibor

1
ตามที่กล่าวไว้ข้างต้นโดย @cobby: ต้องระวังการใช้.toFixed()ในขณะที่มันส่งกลับStringเมื่อคุณอาจต้องการNumber
ริคาร์โด้

28

ถ้าคุณใช้Math.round(5.01)คุณจะได้รับแทน55.0

ถ้าคุณใช้toFixedคุณทำงานเป็นปัดเศษ ปัญหา

หากคุณต้องการสิ่งที่ดีที่สุดของโลกทั้งสองรวมทั้งสอง:

(Math.round(5.01 * 10) / 10).toFixed(1)

คุณอาจต้องการสร้างฟังก์ชั่นสำหรับสิ่งนี้:

function roundedToFixed(_float, _digits){
  var rounded = Math.pow(10, _digits);
  return (Math.round(_float * rounded) / rounded).toFixed(_digits);
}

ทำไมขีดล่างของ params เช่น (_float, _digits) เพียงโพสต์ลิงค์ที่ฉันสามารถหาคำตอบได้ด้วยตัวเอง ขอบคุณ
Shark Lasers


11

ฉันลงคะแนนให้toFixed()แต่สำหรับบันทึกนี่เป็นอีกวิธีหนึ่งที่ใช้การเลื่อนบิตในการแปลงตัวเลขเป็น int ดังนั้นมันจะปัดเศษเป็นศูนย์เสมอ (ลดลงสำหรับตัวเลขบวก, ลบเชิงลบ)

var rounded = ((num * 10) << 0) * 0.1;

แต่เดี๋ยวก่อนเนื่องจากไม่มีฟังก์ชั่นการโทรมันชั่วร้ายเร็ว :)

และนี่คือสิ่งที่ใช้การจับคู่สตริง:

var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');

ฉันไม่แนะนำให้ใช้ตัวแปรสตริงเพียงแค่พูด


7

ลองกับสิ่งนี้:

var original=28.453

// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100  //returns 28.45

// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10  //returns 28.5

// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000  //returns 8.111

ซับซ้อนน้อยกว่าและง่ายต่อการติดตั้ง ...

ด้วยสิ่งนี้คุณสามารถสร้างฟังก์ชั่นที่ต้องทำ:

function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}

แก้ไข : ดูสิ่งนี้วิธีการปัดเศษโดยใช้ ROUND HALF UP โหมดการปัดเศษที่เราส่วนใหญ่ได้รับการสอนในระดับชั้นประถมศึกษา


Nope: RoundAndFix (1.005, 2)
Noyo


4

ทำไมไม่เพียงแค่

let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
  1. toFixed : ส่งคืนสตริงที่แทนหมายเลขที่กำหนดโดยใช้เครื่องหมายจุดคงที่
  2. เครื่องหมายบวก (+) : ตัวดำเนินการยูนารีบวกนำหน้าตัวถูกดำเนินการและประเมินเป็นตัวถูกดำเนินการ แต่พยายามแปลงเป็นตัวเลขหากยังไม่ได้ดำเนินการ


3

เพื่อให้ได้คำตอบที่ดีที่สุด:

var round = function ( number, precision )
{
    precision = precision || 0;
    return parseFloat( parseFloat( number ).toFixed( precision ) );
}

หมายเลขพารามิเตอร์อินพุตอาจ "ไม่" เป็นตัวเลขเสมอในกรณีนี้. toFixed ไม่มีอยู่


3

คำตอบที่ได้รับการยอมรับรุ่น ES 6:

function round(value, precision) {
    const multiplier = 10 ** (precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

3

ใช้วิธี toPrecision:

var a = 1.2345
a.toPrecision(2)

// result "1.2"

คำตอบที่ดีที่สุดที่ฉันเคยลอง ขอบคุณ
Ste

แต่คุณจะต้องระมัดระวังเพราะเป็น12.345.toPrecision( 2 ) "12"
Joshua Pinter

2

หากวิธีการของคุณใช้งานไม่ได้โปรดส่งรหัสของคุณ

อย่างไรก็ตามคุณสามารถทำภารกิจปัดเศษได้สำเร็จดังนี้:

var value = Math.round(234.567*100)/100

จะให้คุณ 234.56

เหมือนกับ

 var value = Math.round(234.567*10)/10

จะให้ 234.5

ด้วยวิธีนี้คุณสามารถใช้ตัวแปรในตำแหน่งของค่าคงที่ตามที่ใช้ข้างต้น


1

ตัวกรองเชิงมุมเล็กน้อยหากใครต้องการ:

angular.module('filters').filter('decimalPlace', function() {
    return function(num, precision) {
        var multiplier = Math.pow(10, precision || 0);
        return Math.round(num * multiplier) / multiplier;
    };
});

ใช้ถ้าผ่าน:

{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}

:)


1

โดยทั่วไปแล้วการปัดเศษทำได้โดยการปรับขนาด: round(num / p) * p

การใช้สัญกรณ์เอ็กซ์โปเนนเชียลจะจัดการกับการปัดเศษของ + ve ตัวเลขอย่างถูกต้อง อย่างไรก็ตามวิธีนี้ล้มเหลวในการปัดเศษกรณีขอบอย่างถูกต้อง

function round(num, precision = 2) {
	var scaled = Math.round(num + "e" + precision);
	return Number(scaled + "e" + -precision);
}

// testing some edge cases
console.log( round(1.005, 2) );  // 1.01 correct
console.log( round(2.175, 2) );  // 2.18 correct
console.log( round(5.015, 2) );  // 5.02 correct

console.log( round(-1.005, 2) );  // -1    wrong
console.log( round(-2.175, 2) );  // -2.17 wrong
console.log( round(-5.015, 2) );  // -5.01 wrong

นี่คือฟังก์ชั่นหนึ่งที่ผมเขียนให้ทำการปัดเศษเลขคณิตคุณสามารถทดสอบด้วยตัวเองได้

/**
 * MidpointRounding away from zero ('arithmetic' rounding)
 * Uses a half-epsilon for correction. (This offsets IEEE-754
 * half-to-even rounding that was applied at the edge cases).
 */

function RoundCorrect(num, precision = 2) {
	// half epsilon to correct edge cases.
	var c = 0.5 * Number.EPSILON * num;
//	var p = Math.pow(10, precision); //slow
	var p = 1; while (precision--> 0) p *= 10;
	if (num < 0)
		p *= -1;
	return Math.round((num + c) * p) / p;
}

// testing some edge cases
console.log(RoundCorrect(1.005, 2));  // 1.01 correct
console.log(RoundCorrect(2.175, 2));  // 2.18 correct
console.log(RoundCorrect(5.015, 2));  // 5.02 correct

console.log(RoundCorrect(-1.005, 2));  // -1.01 correct
console.log(RoundCorrect(-2.175, 2));  // -2.18 correct
console.log(RoundCorrect(-5.015, 2));  // -5.02 correct


0

ดูเหมือนว่าจะทำงานอย่างน่าเชื่อถือในทุกสิ่งที่ฉันโยนไป:

function round(val, multiplesOf) {
  var s = 1 / multiplesOf;
  var res = Math.ceil(val*s)/s;
  res = res < val ? res + multiplesOf: res;
  var afterZero = multiplesOf.toString().split(".")[1];
  return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}

มันปัดเศษขึ้นดังนั้นคุณอาจจำเป็นต้องแก้ไขตามกรณีการใช้งาน สิ่งนี้น่าจะใช้ได้:

console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1

0

หากคุณสนใจการปัดเศษที่เหมาะสมแล้ว:

function roundNumericStrings(str , numOfDecPlacesRequired){ 
     var roundFactor = Math.pow(10, numOfDecPlacesRequired);  
     return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString();  }

มิฉะนั้นถ้าคุณไม่ได้แล้วคุณได้รับคำตอบจากโพสต์ก่อนหน้า

str.slice(0, -1)

0

Math.round( num * 10) / 10 ไม่ทำงาน

ยกตัวอย่างเช่นช่วยให้คุณ1455581777.8-145558160.41310023617.3999999

ใช้เท่านั้น num.toFixed(1)


0

ฉันสร้างหนึ่งที่ส่งกลับชนิดของตัวเลขและวางทศนิยมเฉพาะเมื่อจำเป็น (ไม่มี 0 padding)

ตัวอย่าง:

roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10

roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9

รหัส:

function roundWithMaxPrecision (n, precision) {
    return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}

0

ฉันพบวิธีหลีกเลี่ยงปัญหาความแม่นยำ:

function badRound (num, precision) {
    const x = 10 ** precision;
    return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1

function round (num, precision) {
    const x = 10 ** (precision + 1);
    const y = 10 ** precision;
    return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01

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