JavaScript: ปัดเศษเป็นทศนิยมจำนวนหนึ่ง แต่ตัดค่าศูนย์พิเศษออก


85

นี่คือสถานการณ์: ฉันได้รับเมื่อฉันควรจะได้รับ.9999999999999999 ฉันสามารถที่จะสูญเสียตำแหน่งทศนิยมของความแม่นยำได้ดังนั้นฉันกำลังใช้งานประเภทใดอยู่1.0
.toFixed(15)

ปัดเศษงาน 1.000000000000000แต่ปัญหาคือว่าฉันได้รับ
มีวิธีปัดเศษเป็นทศนิยมกี่ตำแหน่ง แต่ตัดช่องว่างเพิ่มเติมหรือไม่?

หมายเหตุ: .toPrecisionไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการระบุจำนวนตัวเลขหลังจุดทศนิยมเท่านั้น
หมายเหตุ 2: ฉันใช้ไม่ได้.toPrecision(1)เพราะฉันต้องการรักษาความแม่นยำสูงสำหรับตัวเลขที่มีข้อมูลอยู่หลังจุดทศนิยม ตามหลักการแล้วจะมีตำแหน่งทศนิยมมากเท่าที่จำเป็น (สูงสุด 15 ตำแหน่ง)


ประเด็นที่ว่า. toFixed จะส่งกลับ String ดังนั้นเพียงแค่ปัดเศษด้วยตัวเลขจากนั้นกลับไปที่ String จะแปลงกลับใหม่โดยไม่มีศูนย์ต่อท้าย
Neil

@ นาธาน: เพื่อความกระจ่าง คุณเพียงแค่ต้องการลบศูนย์ต่อท้ายในสตริงที่คุณได้รับจาก toFixed () หรือไม่?
Jiri Kriz

คำตอบ:


141
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

4
อย่าลืมที่จะใส่ไว้ในวงเล็บเมื่อคุณปฏิบัติต่อตัวเลขติดลบ: -2.34.toFixed(1)ผลตอบแทน-2.3เนื่องจากการที่มีความสำคัญผู้ประกอบการ
КонстантинВан

1
การใช้ตัวดำเนินการ unary + ควรเร็วกว่าparseFloatฟังก์ชัน: +number.toFixed(13)นิพจน์นี้สามารถใช้เพื่อลบความไม่ถูกต้องของหมายเลข JavaScript เช่นใน 1.0000000000000045
ygoe


19

toFixed()ตามที่ผมเข้าใจคุณต้องการลบเลขศูนย์ต่อท้ายในสตริงที่คุณได้รับผ่านทาง นี่คือการดำเนินการสตริงที่แท้จริง:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123

6
คุณเป็นคนเดียวที่ตอบคำถามจริงๆ .. ขอบคุณ!
Mugen

4
ซึ่งจะทิ้งจุดไว้บนตัวเลขกลมๆ ("100.00" => "100")
pckill

5
@pckill หากคุณไม่ต้องการให้จุดคุณสามารถรวมไว้ในนิพจน์ทั่วไปเพื่อแทนที่ ( ...replace(/\.?0+$/, "");)
Zach Snow

ที่ล้มเหลวใน 0 และ -0 เนื่องจาก0กลายเป็นสตริงว่าง""และ-0กลายเป็น-ซึ่งไม่คาดคิด (เดา) @ zach-snow โซลูชันที่คุณแนะนำยังล้มเหลวใน 0 และ -0
robocat

@ มูเกนมีปัญหาอะไรกับคำตอบของกัส?
trysis

10

Number(n.toFixed(15)) or +(n.toFixed(15)) จะแปลงสตริงทศนิยม 15 ตำแหน่งเป็นตัวเลขโดยลบเลขศูนย์ต่อท้าย


1
คิดว่าฉันจะชี้ให้เห็น + (n.toFixed (... )) มีประสิทธิภาพมากกว่า parseFloat มาก ไม่แน่ใจว่าทำไม แต่ก็มีประสิทธิภาพมากกว่า Number ใน Chrome
Domino

8

หากคุณส่งค่าส่งคืนเป็นตัวเลขศูนย์ต่อท้ายเหล่านั้นจะถูกทิ้ง นอกจากนี้ยังมีรายละเอียดน้อยกว่าที่parseFloat()เป็นอยู่

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

นี้ใช้ประกอบการ + เอกดังนั้นหากใช้นี้เป็นส่วนหนึ่งของการดำเนินงานสตริงคุณจะต้องมีมัด + var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));ก่อนที่จะ: FYI ยูนารี + หน้าสตริงจะแปลงเป็นตัวเลข จาก MDN: Unary + สามารถ:

แปลงการแทนค่าสตริงของจำนวนเต็มและการลอยตลอดจนค่าที่ไม่ใช่สตริงเป็นจริงเท็จและเป็นโมฆะ สนับสนุนจำนวนเต็มในรูปแบบทศนิยมและเลขฐานสิบหก ("0x" -prefixed) รองรับตัวเลขเชิงลบ (แม้ว่าจะไม่ใช่เลขฐานสิบหก) หากไม่สามารถแยกวิเคราะห์ค่าใดค่าหนึ่งได้ค่านั้นจะประเมินเป็น NaN


@robocat ฉันเพิ่งทำการตรวจสอบง่ายๆ +(4.1).toFixed(4)คือ4.1ในChrome 60
КонстантинВан

ฉันไม่เข้าใจ อะไรคือสาเหตุที่คำตอบนี้ถูกโหวตลง?
КонстантинВан

@K คุณพูดถูกดังนั้นฉันจึงลบความคิดเห็นก่อนหน้าของฉันและเพิ่มคำตอบ (ฉันคิดว่าฉันใช้ infix + กับสตริงบน lhs แทนที่จะใช้ unary + อย่างถูกต้องฉันมักจะระวังมากกว่านี้ไชโย)
robocat

คำตอบนี้ยังคงใช้ได้กับ NaN, Infinity, -Infinity, 3e30 และ 0 คำตอบอื่น ๆ บางคำตอบล้มเหลวในบางกรณี
robocat

(4) .toFixed (2) -> "4.00" ใน Chrome 60.0.3112.113
Daniel Que

1

ไม่มีสิ่งเหล่านี้ทำให้ฉันได้รับสิ่งที่ฉันกำลังมองหาจากชื่อคำถามนั่นคือตัวอย่างเช่น 5.00 ถึง 5 และ 5.10 เป็น 5.1 วิธีแก้ปัญหาของฉันมีดังนี้:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

หมายเหตุ: regex ใช้งานได้ก็ต่อเมื่อ places > 0

ปล. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed


ล้มเหลว5e30(เปลี่ยนหมายเลขเป็น5e3) คดีหักมุมโหด!
robocat

0

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

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));

0

toFixed()วิธีการฟอร์แมตใช้เครื่องหมายจุดคงที่และผลตอบแทนnumberstring

ใช้กลยุทธ์การปัดเศษครึ่งขึ้น

(0.124).toFixed(2); // returns 0.12
(0.125).toFixed(2); // returns 0.13

ตามที่คุณอธิบายไว้มันจะส่งผลให้ (อาจไม่จำเป็น) ต่อท้ายด้วยศูนย์ในบางครั้ง

(0.001).toFixed(2); // returns 0.00

คุณอาจไม่ต้องการกำจัดศูนย์ต่อท้ายเหล่านั้นโดยพื้นฐานแล้วคุณสามารถแปลงกลับเป็นnumberไฟล์. มีหลายวิธีในการทำเช่นนี้

+(0.001).toFixed(2); // the shortest

สำหรับภาพรวมของวิธีการต่างๆในการแปลงสตริงเป็นตัวเลขโปรดตรวจสอบคำถามนี้ซึ่งมีคำตอบที่ยอดเยี่ยม

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