หมายเลขรูปแบบที่จะแสดงทศนิยม 2 ตำแหน่งเสมอ


782

ฉันต้องการจัดรูปแบบตัวเลขของฉันให้แสดงทศนิยม 2 ตำแหน่งเสมอการปัดเศษที่เกี่ยวข้อง

ตัวอย่าง:

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

ฉันได้ใช้สิ่งนี้:

parseFloat(num).toFixed(2);

แต่มันแสดง1เป็นมากกว่า11.00


2
ฉันหมายถึงถ้าฉันป้อน 1 จะไม่แสดงหมายเลขเป็น 1.00 แต่ถ้าฉันป้อน 1.345 ก็จะแสดง 1.35
Varada

1
ฉันได้ตั้งคำถามใหม่ถึงสิ่งที่ฉันเชื่อว่าคุณกำลังมองหา โปรดตรวจสอบเพื่อให้แน่ใจว่าฉันเข้าใจคุณถูกต้อง
หนัก

การปัดเศษที่แม่นยำพร้อมการสนับสนุนเช่น gist.github.com/ArminVieweg/28647e735aa6efaba401
TarranJones


คำตอบ:


1116
(Math.round(num * 100) / 100).toFixed(2);

การสาธิตสด

หมายเหตุว่ามันจะปัดเศษทศนิยม 2 ตำแหน่งเพื่อให้การป้อนข้อมูลที่จะกลับมา1.3461.35


6
@Kooilnc: OP ต้องการ1ที่จะแสดงเป็น1.00และจะแสดงเป็น1.341 1.34
drudge

49
ไม่จำเป็นต้องใช้ round () ตั้งแต่ toFixed () ปัดเศษ
Milan Babuškov

27
toFixed () ปัดเศษ แต่อย่าลืมว่ามันส่งคืนสตริง ... ดังนั้นวิธีนี้จึงมีประโยชน์สำหรับการแสดงผลเท่านั้น หากคุณต้องการคำนวณทางคณิตศาสตร์เพิ่มเติมเกี่ยวกับค่าที่ปัดเศษแล้วอย่าใช้ toFixed ()
TWright

8
ตาม MDN Math.round จะไม่ให้ผลลัพธ์ที่ถูกต้องเสมอไปเนื่องจากข้อผิดพลาดในการปัดเศษ ฉันทดสอบสิ่งนี้ด้วย 1.005 ซึ่งควรจะเป็น 1.01 แต่ให้ 1.00 ใช้คำตอบของฉันเพื่อความถูกต้องสอดคล้อง: stackoverflow.com/a/34796988/3549440
Nate

13
(+num).toFixed(2)คำตอบนี้ทั้งหมดอาจจะลดลงไป มันยังคงมีข้อผิดพลาดในการปัดเศษเดิมให้ดูคำตอบของเนท
RobG

322
Number(1).toFixed(2);         // 1.00
Number(1.341).toFixed(2);     // 1.34
Number(1.345).toFixed(2);     // 1.34 NOTE: See andy's comment below.
Number(1.3450001).toFixed(2); // 1.35


1
บรรทัดสุดท้ายเป็นเท็จ ฉันลองสิ่งนี้ในคอนโซล Chrome และ `` Number (1.365) .toFixed (2) ส่งคืน "1.37"
Andre

1
@Andre, Chrome 29.0.1547.57 ให้ฉันสำหรับการแสดงออก1.34 Number(1.345).toFixed(2)
Drew Noakes

1
toFixed ไม่ทำปัดเศษซึ่งคุณสามารถเห็นในเกือบทุกจำนวนการทดสอบ
andy

40
ส่งโดยบังเอิญว่าความคิดเห็นสุดท้ายก่อนที่จะจบ .. 1.345เป็นตัวอย่างของตัวเลขที่ไม่สามารถจัดเก็บในจุดลอยดังนั้นฉันคิดว่าเหตุผลที่มันไม่เป็นไปตามที่คุณคาดหวังว่ามันเป็นจริงเก็บไว้เป็นจำนวนเล็กน้อย น้อยกว่า 1.345 และมันลดลง หากคุณทดสอบแทนคุณ(1.34500001).toFixed(2)จะเห็นว่ามันถูกต้องรอบ1.35
andy

94

คำตอบนี้จะล้มเหลวถ้าvalue = 1.005จะล้มเหลวถ้า

ในฐานะที่เป็นทางออกที่ดีกว่าปัญหาการปัดเศษสามารถหลีกเลี่ยงได้โดยใช้ตัวเลขที่แสดงในรูปแบบเลขชี้กำลัง:

Number(Math.round(1.005+'e2')+'e-2'); // 1.01

รหัสทำความสะอาดตามที่แนะนำโดย @Kon และผู้แต่งดั้งเดิม:

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)

คุณสามารถเพิ่มtoFixed()ที่ท้ายเพื่อรักษาจุดทศนิยมเช่น: 1.00แต่โปรดทราบว่ามันจะกลับมาเป็นสตริง

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces).toFixed(decimalPlaces)

เครดิต: การปัดเศษทศนิยมใน JavaScript


13
น่าแปลกที่ทุกคนในที่นี่ไม่เห็นว่าtoFixedมีปัญหาการปัดเศษ คำตอบของคุณควรเป็นคำตอบที่ยอมรับได้
Armfoot

1
เพิ่งทดสอบเพื่อดูว่ายังคงเป็นกรณีนี้หรือไม่ คุณยังคงถูกต้องสำหรับ Chrome เวอร์ชัน 59.0.3071.115 โซลูชันของคุณจะรวมเป็น 1.005 (1.01) และปัดเศษสำหรับ 1.00499999 (1.00)
Artistan

jsfiddle.net/Artistan/qq895bnp/28 มี "เวลา" เมื่อการแก้ไขจะทำงานได้ แต่มันไม่สอดคล้องกันมาก :)
Artistan

หมายเลขเซอร์ราวด์ใน parseFloat เป็นสตริงที่ส่งคืน
user889030

1
นี่คือคำตอบที่มั่นคง การปรับปรุงสองสามอย่างที่ฉันคิดได้: (1) VS Code (ไฟล์ TypeScript) ไม่ชอบ Math.round () ที่ส่งผ่านสตริง (2) ทำให้จำนวนตำแหน่งทศนิยมเป็นแบบไดนามิก (ไม่ใช่ฮาร์ดโค้ดเป็น 2) (3) toFixed () ดูเหมือนไม่จำเป็น ดังนั้นสิ่งที่ฉันมาด้วยคือNumber(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
Kon

23
var num = new Number(14.12);
console.log(num.toPrecision(2));//outputs 14
console.log(num.toPrecision(3));//outputs 14.1
console.log(num.toPrecision(4));//outputs 14.12
console.log(num.toPrecision(5));//outputs 14.120

นั่นจะให้ผลลัพธ์ที่ไม่คาดคิดหากจำนวนของคุณสามารถเป็น 1.4 และ 23.654 และ 0 คุณจะต้องแม่นยำขนาดไหน
shinzou

2
หมายเหตุ OP จะขอ"ปัดเศษที่บังคับ" toPrecisionรูปแบบเฉพาะหมายเลขที่หมายเลขเฉพาะของตำแหน่งทศนิยมเพียงแค่ออกจากตำแหน่งซ้ำซ้อน แต่ไม่ปัดเศษพวกเขา สิ่งนี้อาจมีประโยชน์มากแน่นอน แต่สิ่งสำคัญคือต้องเข้าใจความแตกต่าง
Boaz - Reinstate Monica

1
ที่จริงแล้วความแม่นยำจะไม่วนตาม Mozilla ทดสอบ:(20.55).toPrecision(3) "20.6"
James L.

2
หากคุณต้องการตัดเลขศูนย์ต่อท้ายให้โยนไปที่ตัวเลขหรือลอยหลังจากใช้toFixed: const formattedVal = Number(val.toFixed(2));อย่าใช้toPrecisionเนื่องจากจะนับตัวเลขที่ไม่ใช่ทศนิยมเมื่อใช้พารามิเตอร์ความแม่นยำ
James L.

17

สำหรับการปัดเศษที่แม่นยำที่สุดให้สร้างฟังก์ชันนี้:

function round(value, decimals) {
    return Number(Math.round(value +'e'+ decimals) +'e-'+ decimals).toFixed(decimals);
}

และใช้เพื่อปัดเศษทศนิยม 2 ตำแหน่ง:

console.log("seeked to " + round(1.005, 2));
> 1.01

ขอขอบคุณที่Razu , นี้บทความและMDN อ้างอิง


1
1.0049999999999998934 แล้วล่ะ
4esn0k

1
ไม่เกินกว่า 2 dp
Stephen Adelakun

1
jsfiddle.net/Artistan/qq895bnpทดสอบแล้วนี่เป็นวิธีการเดียวที่ฉันเห็น ขอบคุณ
Artistan

16

สำหรับเบราว์เซอร์สมัยใหม่ให้ใช้toLocaleString:

var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });

ระบุแท็กสถานที่เกิดเหตุเป็นพารามิเตอร์แรกที่จะควบคุมตัวคั่นทศนิยม สำหรับจุดให้ใช้ตัวอย่างเช่นโลแคล English US:

num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

ซึ่งจะช่วยให้:

1.35

ประเทศส่วนใหญ่ในยุโรปใช้เครื่องหมายจุลภาคเป็นตัวคั่นทศนิยมดังนั้นหากคุณใช้ภาษาสวีเดน / สวีเดน:

num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

มันจะให้:

1,35


ไม่แน่ใจว่าเพราะเหตุใดการลงคะแนนนี้จึงทำงานได้ดีสำหรับฉัน กรุณาเพิ่มความคิดเห็นหากคุณตั้งใจจะลงคะแนนหากมีสิ่งผิดปกติเกิดขึ้น!
John Culviner

13

คำตอบที่ง่ายที่สุด:

var num = 1.2353453;
num.toFixed(2); // 1.24

ตัวอย่าง: http://jsfiddle.net/E2XU7/


11
ดีtoFixedก็บอกอยู่แล้วในstackoverflow.com/a/13292833/218196 คำถามของคุณให้ข้อมูลอะไรเพิ่มเติม
เฟลิกซ์ลิ่ง

คำตอบนั้นไม่มีฟังก์ชั่นรอบคำตอบของฉันรวมถึงสรรพสินค้า
macio.Jun

8
เอ่อ? มันเป็นคำตอบเดียวกันทั้งหมด โทรหาtoFixedเบอร์
เฟลิกซ์ลิ่ง

1
ถูกต้องฟังก์ชั่นเดียวกัน แต่ผลลัพธ์ของคำตอบนั้นทำให้เข้าใจผิดฉันเพิ่งแก้ไขมันโดยแสดงฟังก์ชั่นการปัดเศษ
macio.Jun

คำถามระบุว่า: "... การปัดเศษหากทำได้" คำตอบของคุณไม่เกี่ยวข้องกับการปัดเศษ
Chris

12

วิธีแก้ปัญหาทั่วไปที่มากขึ้นสำหรับการปัดเศษเป็นตำแหน่ง N

function roundN(num,n){
  return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}


console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))

Output

1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346

1
ผู้เสนอราคานี้ล้มเหลวด้วยจำนวนที่ใกล้เคียงกับ 0 roundN(-3.4028230607370965e+38,2)ส่งคืน"-3.4028230607370965e+38"แทนค่าที่คาดไว้ 0.00
Ferrybig

ที่น่าสนใจ @Ferrybig ฉันจะทดสอบตัวเลขที่คุณพูดถึงและคิดว่าวิธีแก้ปัญหาขอบคุณสำหรับการทดสอบ
23719

1
โปรดทราบว่าตัวเลขที่กล่าวถึงก่อนหน้านี้ไม่ควรแสดงศูนย์ แต่มีจำนวนมากแทนนี่เป็นเพียงข้อผิดพลาดในสมองของฉัน แต่มันก็ยังใช้งานไม่ได้เพราะมันยังไม่แสดงทศนิยม 2 ครั้ง
Ferrybig


9

หากคุณใช้ jQuery อยู่แล้วคุณสามารถดูการใช้ปลั๊กอินรูปแบบตัวเลข jQuery

ปลั๊กอินสามารถส่งกลับตัวเลขที่จัดรูปแบบเป็นสตริงคุณสามารถตั้งค่าทศนิยมและตัวคั่นหลักพันและคุณสามารถเลือกจำนวนทศนิยมที่จะแสดง

$.number( 123, 2 ); // Returns '123.00'

นอกจากนี้คุณยังจะได้รับรูปแบบ jQuery จำนวนจาก GitHub


11
มันเกินความจริงที่จะใช้ปลั๊กอิน "เพิ่งจะมีส่วนทศนิยมความยาวคงที่"
Lashae

9
@ Lashae แน่นอนถ้านั่นคือทั้งหมดที่คุณต้องการจะทำ ฉันโพสต์สิ่งนี้ในกรณีที่ OP หรือคนอื่นต้องการฟังก์ชั่นพิเศษที่ปลั๊กอินให้เช่นกัน
Sam Sehnert

หากผู้โพสต์ของคำถามได้เพิ่มแท็ก jQuery ของหลักสูตร;)
fullstacklife

7

นี่คือสิ่งที่คุณหมายถึงอะไร

function showAsFloat(num, n){
      return !isNaN(+num) ? (+num).toFixed(n || 2) : num;
}

document.querySelector('#result').textContent = 
    [
     'command                      | result',
     '-----------------------------------------------',
     'showAsFloat(1);              | ' + showAsFloat(1),
     'showAsFloat(1.314);          | ' + showAsFloat(1.314),
     'showAsFloat(\'notanumber\')    | ' + showAsFloat('notanumber'),
     'showAsFloat(\'23.44567\', 3)   | ' + showAsFloat('23.44567', 3),
     'showAsFloat(2456198, 5)      | ' + showAsFloat('2456198', 5),
     'showAsFloat(0);              | ' + showAsFloat(0)
    ].join('\n');
<pre id="result"></pre>


6

แปลงตัวเลขให้เป็นสตริงโดยเก็บทศนิยมเพียงสองตัว:

var num = 5.56789;
var n = num.toFixed(2);

ผลลัพธ์ของ n จะเป็น:

5.57

4

คุณกำลังมองหาพื้น?

var num = 1.42482;
var num2 = 1;
var fnum = Math.floor(num).toFixed(2);
var fnum2 = Math.floor(num2).toFixed(2);
alert(fnum + " and " + fnum2); //both values will be 1.00

4
ฉันไม่คิดว่าเขาต้องการปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด
drudge

ใช่ฉันไม่แน่ใจจากคำอธิบาย แต่ฉันเพิ่งจะโยนมันออกมามีกรณี
samwise

3
function currencyFormat (num) {
    return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}

console.info(currencyFormat(2665));   // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00

3

นี่เป็นฟังก์ชั่นทั่วไปที่สามารถจัดรูปแบบตามจำนวนตำแหน่งทศนิยมใด ๆ :

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}

3

ในกรณีที่ต้องการการจัดรูปแบบเฉพาะคุณควรเขียนกิจวัตรของคุณเองหรือใช้ฟังก์ชั่นห้องสมุดที่ทำในสิ่งที่คุณต้องการ ฟังก์ชั่น ECMAScript พื้นฐานมักไม่เพียงพอสำหรับการแสดงตัวเลขที่จัดรูปแบบ

คำอธิบายอย่างละเอียดเกี่ยวกับการปัดเศษและการจัดรูปแบบอยู่ที่นี่: http://www.merlyn.demon.co.uk/js-round.htm#RiJ

ตามกฎทั่วไปการปัดเศษและการจัดรูปแบบควรถูกทำเป็นรูปเป็นขั้นตอนสุดท้ายก่อนออก การทำก่อนหน้านี้อาจทำให้เกิดข้อผิดพลาดที่ใหญ่มากและทำลายการจัดรูปแบบ


มีหลายครั้งที่ฉันส่ายหัวด้วยตัวเองเพื่อเลือกที่จะเข้ามามีส่วนร่วมในช่วงปลายแพลตฟอร์ม JS / Ecma ทั้งหมดนี้ :( "ในกรณีที่จำเป็นต้องใช้การจัดรูปแบบเฉพาะคุณควรเขียนกิจวัตรของคุณเองหรือใช้ฟังก์ชั่นห้องสมุดที่ทำในสิ่งที่คุณต้องการฟังก์ชั่น ECMAScript ขั้นพื้นฐานมักจะไม่เพียงพอสำหรับการแสดงตัวเลขที่จัดรูปแบบแล้ว" แต่เป็นเพราะความจริงนั้นมีอยู่เพียงแค่เศร้ารับลูกบอล Javascript! :)
:

2

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>


2

เพิ่งพบกับหนึ่งในเธรดที่ยาวที่สุดนี้ด้านล่างคือโซลูชันของฉัน:

parseFloat(Math.round((parseFloat(num * 100)).toFixed(2)) / 100 ).toFixed(2)

แจ้งให้เราทราบหากใครสามารถกระตุ้นรู


2


2
โค้ดนี้เพียงพอสำหรับความต้องการของคุณ parseFloat(num.toFixed(2))
kva

1

คุณไม่ได้ให้ภาพรวมทั้งหมดกับเรา

javascript:alert(parseFloat(1).toFixed(2))แสดง 1.00 ในเบราว์เซอร์ของฉันเมื่อฉันวางไว้ในแถบตำแหน่ง 0 อย่างไรก็ตามหากคุณทำบางสิ่งกับมันหลังจากนั้นมันจะเปลี่ยนกลับ

var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)


shows 1 and not 1.00

ใช้งานได้ใน FF 50, Chrome 49 และ IE 8
Florian Straub


1

ฉันต้องตัดสินใจระหว่างการแปลง parseFloat () และ Number () ก่อนที่ฉันจะทำการโทร toFixed () นี่คือตัวอย่างของการจัดรูปแบบตัวเลขสำหรับการป้อนข้อมูลผู้ใช้หลังการจับภาพ

HTML:

<input type="number" class="dec-number" min="0" step="0.01" />

จัดการเหตุการณ์:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

โค้ดด้านบนจะส่งผลให้เกิดข้อยกเว้น TypeError โปรดทราบว่าแม้ว่าประเภทการป้อน html จะเป็น "หมายเลข" แต่การป้อนข้อมูลของผู้ใช้นั้นเป็นประเภทข้อมูล อย่างไรก็ตามฟังก์ชัน toFixed () อาจถูกเรียกใช้บนวัตถุที่เป็นตัวเลขเท่านั้น

รหัสสุดท้ายของฉันจะมีลักษณะดังนี้:

$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

เหตุผลที่ฉันชอบโยนด้วย Number () กับ parseFloat () เป็นเพราะฉันไม่ต้องทำการตรวจสอบเพิ่มเติมไม่ว่าจะเป็นสตริงอินพุตว่างเปล่าหรือค่า NaN ฟังก์ชัน Number () จะจัดการสตริงว่างโดยอัตโนมัติและแปลงเป็นศูนย์


0

ฉันชอบ:

var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75

ปัดเศษตัวเลขด้วยทศนิยม 2 ตำแหน่งจากนั้นตรวจสอบให้แน่ใจว่าได้ทำการวิเคราะห์ด้วยparseFloat() การคืนค่า Number ไม่ใช่ String ยกเว้นว่าคุณไม่สนใจว่าเป็น String หรือ Number


ฉันเดาว่าถ้าจุดประสงค์เพื่อแสดงด้วยความแม่นยำทศนิยม 2 ตำแหน่งการแยกโฟลเดอร์จะยุ่งกับมัน เช่นparseFloat("1.00") // 1
Stijn de Witt

0

ขยายวัตถุคณิตศาสตร์ด้วยวิธีความแม่นยำ

Object.defineProperty(Math, 'precision',{
   value: function (value,precision,type){
             var v = parseFloat(value),
                 p = Math.max(precision,0)||0,
                 t = type||'round';
              return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
          }
    });

console.log(
    Math.precision(3.1,3), // round 3 digits 
    Math.precision(0.12345,2,'ceil'), // ceil 2 digits
    Math.precision(1.1) // integer part
)



0

นี่เป็นอีกวิธีในการปัดเศษโดยใช้เฉพาะพื้นหมายถึงทำให้แน่ใจว่าจำนวนที่คำนวณได้จะไม่สูงกว่าจำนวนเงินดั้งเดิม (บางครั้งจำเป็นสำหรับธุรกรรม):

Math.floor(num* 100 )/100;

0

คุณสามารถลองรหัสนี้:

    function FormatNumber(number, numberOfDigits = 2) {
        try {
            return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(2));
        } catch (error) {
            return 0;
        }
    }

    var test1 = FormatNumber('1000000.4444');
    alert(test1); // 1,000,000.44

    var test2 = FormatNumber(100000000000.55555555, 4);
    alert(test2); // 100,000,000,000.56



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