วิธีแยกวิเคราะห์ทศนิยมด้วยทศนิยมสองตำแหน่งใน javascript


410

ฉันมีรหัสต่อไปนี้ ฉันอยากได้มันถ้า price_result เท่ากับจำนวนเต็มสมมุติว่า 10 แล้วฉันอยากจะเพิ่มทศนิยมสองตำแหน่ง ดังนั้น 10 น่าจะเป็น 10.00 หรือถ้ามันเท่ากับ 10.6 จะเท่ากับ 10.60 ไม่แน่ใจว่าจะทำอย่างไร

price_result = parseFloat(test_var.split('$')[1].slice(0,-1));

คำตอบ:


914

คุณสามารถใช้toFixed ()เพื่อทำสิ่งนั้น

var twoPlacedFloat = parseFloat(yourString).toFixed(2)

1
ดีใจที่ได้ช่วยเหลือและติดตามผลงานที่ดีต่อไป - "เรียนรู้สิ่งใหม่ทุกวัน"
Mahesh Velaga

3
toFixed ค่อนข้างเป็นบั๊กซี และนี่คือลิงค์ที่ดีกว่า w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz

125
แต่ toFixed () คืนค่าหมายเลขเป็นสตริงถ้าคุณจะเปรียบเทียบตัวเลขคุณต้องใช้ parseFloat อีกครั้ง
Pedro Muniz

19
ใช้var twoPlacedFloat = + parseFloat(yourString).toFixed(2)เพื่อแปลงเป็นโฟล
Jose Rui Santos

13
เพิ่ม parens เพื่อรับตัวเลขแทน string: parseFloat ((yourString) .toFixed (2));
pvanallen

50

เมื่อคุณใช้toFixedมันจะส่งคืนค่าเป็นสตริงเสมอ บางครั้งรหัสนี้ซับซ้อน เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถสร้างวิธีอื่นสำหรับ Number

Number.prototype.round = function(p) {
  p = p || 10;
  return parseFloat( this.toFixed(p) );
};

และใช้:

var n = 22 / 7; // 3.142857142857143
n.round(3); // 3.143

หรือเพียงแค่:

(22/7).round(3); // 3.143

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

สิ่งนี้ช่วยให้ฉันปวดหัวได้บ้าง +1 สำหรับสิ่งนั้น ฉันไม่รู้ว่ามันจะเปลี่ยนตัวเลขเป็นสตริง
Lukas

@Lukas ไม่ใช่ถ้าทำ parseFloat
Vlada

สิ่งนี้จะคืนค่า 2 หากฉันใช้กับหมายเลข '2.00'
Saurin Dashadia

วิธีนี้ใช้สำหรับการแก้ไขไม่ใช่สำหรับการจัดรูปแบบ ตัวอย่างเช่น: 0.1 + 0.2 // 0.30000000000000004ฉันต้องการการแก้ไขสำหรับสิ่งนั้น(0.1+0.2).round() // 0.3
Vlada

47

หากคุณต้องการประสิทธิภาพ (เหมือนในเกม):

Math.round(number * 100) / 100

เร็วกว่า parseFloat ประมาณ 100 เท่า (number.toFixed (2))

http://jsperf.com/parsefloat-tofixed-vs-math-round


5
ด้วยสูตรข้างต้น '2.00' จะได้ผลลัพธ์เป็น 2 แต่ฉันต้องการให้เป็น 2.00
Saurin Dashadia

5
คุณมีทั้งสองวิธีไม่ได้ หากคุณต้องการให้ผลลัพธ์เป็นตัวเลขแทนที่จะเป็นสตริงคุณจะไม่ได้รับค่าศูนย์ต่อท้าย ดังนั้นคุณสามารถใช้การแปลงข้างต้นเป็นสตริง: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen

3
ความเร็วจะเพิ่มขึ้นหรือไม่ถ้าฉันเปลี่ยน 100 เป็น 200?
alashow

หากจำนวนของการดำเนินการจุดลอยตัวยังคงเหมือนเดิมความเร็วจะเท่ากันดังนั้นไม่
Rob Boerman

ทำไมnumber * 1ฉันถึงขาดอะไรง่ายๆไป maybe
ncubica

11

หากต้องการส่งคืนตัวเลขให้เพิ่มวงเล็บอีกหนึ่งชั้น ช่วยให้สะอาด

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));

2
สูตรของคุณขาดหายไปหรือเปล่า var twoPlacedFloat = parseFloat(('2.00').toFixed(2))สร้างข้อผิดพลาด
Saurin Dashadia

ขออภัยมีตัวแปรสตริงแทนตัวเลขซึ่งต้องแก้ไข () ต้องการ - แก้ไขแล้ว แต่คำตอบของ Rob ที่ใช้ Math.round เป็นสิ่งที่ต้องพิจารณาในแง่ของประสิทธิภาพ
pvanallen

นี่ควรเป็นความเห็นต่อคำตอบของ Vlada
Rodrirokr

5

หากวัตถุประสงค์ของคุณคือการแยกวิเคราะห์และการป้อนข้อมูลของคุณอาจเป็นตัวอักษรคุณควรคาดหวังfloatและtoFixedจะไม่ให้สิ่งนั้นดังนั้นนี่คือฟังก์ชันที่เรียบง่ายสองอย่างที่จะให้สิ่งนี้:

function parseFloat2Decimals(value) {
    return parseFloat(parseFloat(value).toFixed(2));
}

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}

2
ที่ไม่ทำงานตามที่ได้รับการพิสูจน์ parseFloat(parseFloat('10.5').toFixed(2))ผลตอบแทนespected10.5 10.50ก็parseFloat(parseFloat('10.50').toFixed(2))กลับมา10.5
MTK

มันเป็นแบบลอยตัวดังนั้น 10.5 จึงเท่ากับ 10.50
โหด

ฉันรู้ว่า 10.5 == 10.50 แต่ฉันต้องพิมพ์ไปที่ลูกค้า 10.50 ไม่ใช่ 10.5
MTK

2

ceil จาก lodash น่าจะดีที่สุด

_.ceil("315.9250488",2) 
_.ceil(315.9250488,2) 
_.ceil(undefined,2)
_.ceil(null,2)
_.ceil("",2)

จะทำงานด้วยหมายเลขและปลอดภัย


1
คำตอบที่ใช้ได้ถ้าใช้ lodash ฉันกำลังใช้ underscore.js และปัจจุบันที่ 1.9.1 ไม่มีฟังก์ชันที่คล้ายกัน
Rodrirokr

1

@sd คำตอบสั้น ๆ : ไม่มีวิธีใน JS ที่จะมีค่าประเภทข้อมูล Number ที่มีศูนย์ต่อท้ายหลังทศนิยม

Long Answer:มันเป็นคุณสมบัติของtoFixedหรือtoPrecisionฟังก์ชั่นของ JavaScript เพื่อกลับสตริง เหตุผลสำหรับสิ่งนี้คือประเภทข้อมูล Number ไม่สามารถมีค่าเช่น = 2.00 มันจะลบศูนย์ต่อท้ายหลังจุดทศนิยมเสมอซึ่งเป็นคุณสมบัติ inbuilt ของ Number Datatype ดังนั้นเพื่อให้บรรลุข้างต้นใน JS เรามี 2 ตัวเลือก

  1. ใช้ข้อมูลเป็นสตริงหรือ
  2. ตกลงที่จะมีค่าที่ถูกตัดทอนด้วยตัวพิมพ์ '0' ที่ส่วนท้าย 2.50 -> 2.5 จำนวนต้องไม่มีศูนย์ต่อท้ายหลังจุดทศนิยม

0

กรุณาใช้ฟังก์ชั่นด้านล่างหากคุณไม่ต้องการปัดเศษ

function ConvertToDecimal(num) {
    num = num.toString(); //If it's not already a String
    num = num.slice(0, (num.indexOf(".")) + 3); //With 3 exposing the hundredths place
   alert('M : ' +  Number(num)); //If you need it back as a Number    
}

0

สำหรับสิ่งที่มีค่า: ตัวเลขทศนิยมเป็นตัวเลขทศนิยมคุณจะปัดเศษเป็นค่าอื่นหรือไม่ ภายในจะประมาณเศษส่วนทศนิยมตามกฎของเลขทศนิยมและการจัดการ มันยังคงเป็นตัวเลขทศนิยม (ทศนิยมใน JS เป็นสองเท่า) ภายในไม่ว่าคุณจะต้องการแสดงด้วยตัวเลขกี่หลัก

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


0

คุณสามารถใช้. toFixed () เพื่อรับค่าทศนิยม 2 หลัก

Exampale

let newValue = parseFloat(9.990000).toFixed(2)

//output
9.99

-1

ลองนี้ (ดูความคิดเห็นในรหัส):

function fixInteger(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseInt(value);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseInt(value);
    }
    // apply new value to element
    $(el).val(newValue);
}

function fixPrice(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseFloat(value.replace(',', '.')).toFixed(2);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseFloat(value).toFixed(2);
    }
    // apply new value to element
    $(el).val(newValue);
}



-2
Solution for FormArray controllers 

เตรียมใช้งานตัวสร้างฟอร์ม FormArray

  formInitilize() {
    this.Form = this._formBuilder.group({
      formArray: this._formBuilder.array([this.createForm()])
    });
  }

สร้างแบบฟอร์ม

  createForm() {
    return (this.Form = this._formBuilder.group({
      convertodecimal: ['']
    }));
  }

ตั้งค่าแบบฟอร์มเป็นตัวควบคุมแบบฟอร์ม

  setFormvalues() {
    this.Form.setControl('formArray', this._formBuilder.array([]));
    const control = <FormArray>this.resourceBalanceForm.controls['formArray'];
    this.ListArrayValues.forEach((x) => {
      control.push(this.buildForm(x));
    });
  }

  private buildForm(x): FormGroup {
    const bindvalues= this._formBuilder.group({
      convertodecimal: x.ArrayCollection1? parseFloat(x.ArrayCollection1[0].name).toFixed(2) : '' // Option for array collection
// convertodecimal: x.number.toFixed(2)    --- option for two decimal value 
    });

    return bindvalues;
  }

-3

ฉันมีทางออกอื่น

คุณสามารถใช้round()เพื่อทำเช่นนั้นแทนtoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)

7
@ AustinHenley ฉันลองใช้รอบ () และมันไม่ทำงาน นั่นอาจเป็นเหตุผลว่าทำไมคนถึงลงคะแนน เขาอาจจะหมายถึง Math.round ()
นาธาน

@Nathan จะต้องใช้แบบอินไลน์หลังจากparseFloat()ที่ฉันได้อัปเดตคำตอบโดย @zsalzbank
Alastair

3
ไม่มันไม่ทำงาน คุณอาจลอง Math.round (parseFloat (yourString), 2);
Augie Gardner

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