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
기꺼이 도와와의 좋은 작업 계속 - "매일 새로운 것을 학습"
마헤 Velaga을

3
toFixed는 꽤 버그가 있습니다. 또한, 여기 W3 스쿨보다 더 나은 링크의 developer.mozilla.org/en-US/docs/JavaScript/Reference/...은
gotofritz

125
그러나 toFixed ()는 숫자를 문자열로 반환합니다. 숫자를 비교하려면 parseFloat를 다시 사용해야합니다.
Pedro Muniz

19
var twoPlacedFloat = + parseFloat(yourString).toFixed(2)float로 변환하는 데 사용
Jose Rui Santos

13
문자열 대신 숫자를 얻으려면 parens를 추가하십시오. 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

장바구니 프로그램을 작성하고 parseFloat () 메소드에 연결된 toFixed () 및 round () 메소드를 사용해 보았습니다. 이 방법들 중 어느 것도 parseFloat ()와 함께 작동하지 않았습니다.
Chris22

이것은 나에게 두통을 구했다. 그냥 +1하십시오. 숫자가 문자열로 바뀔지 몰랐습니다.
Lukas

@Lukas가 아니라면 parseFloat
Vlada

'2.00'숫자에 적용하면 2를 반환합니다.
Saurin Dashadia

이 방법은 서식이 아닌 수정을위한 것입니다. 예를 들면 다음과 0.1 + 0.2 // 0.30000000000000004같이 수정해야합니다.(0.1+0.2).round() // 0.3
Vlada

47

게임과 같은 성능이 필요한 경우 :

Math.round(number * 100) / 100

parseFloat (number.toFixed (2))보다 약 100 배 빠릅니다.

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


5
위의 수식 '2.00'을 사용하면 2를 반환하지만 2.00이되기를 바랍니다.
Saurin Dashadia

5
두 가지 방법을 모두 사용할 수는 없습니다. 출력이 문자열 대신 숫자가되도록하려면 후행 0을 얻지 못합니다. 따라서 위의 문자열을 문자열로 변환하여 사용할 수 있습니다. var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen

3
100을 200으로 바꾸면 속도가 증가합니까?
alashow

부동 소수점 연산의 수가 동일하게 유지되면 속도는 동일합니다.
Rob Boerman

number * 1내가 왜 🤔을 놓치고 있지 않은가?
ncubica

11

숫자를 반환하려면 다른 괄호 레이어를 추가하십시오. 깨끗하게 유지합니다.

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

2
수식에 빠진 것이 있습니까? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))오류를 생성합니다.
Saurin Dashadia

죄송합니다. 숫자 대신 문자열 변수가 있었으므로 toFixed ()에 필요합니다. 이제 수정되었습니다. 그러나 Math.round를 사용한 Rob의 답변은 성능 측면에서 고려해야 할 사항입니다.
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
예상대로 작동하지 않습니다. espected를 parseFloat(parseFloat('10.5').toFixed(2))반환 10.5합니다 10.50. 또한 parseFloat(parseFloat('10.50').toFixed(2))반환10.5
MTK

그것은 float입니다. 그래서 10.5는 10.50과 같습니다
Savage

10.5 == 10.50이라는 것을 알고 있지만 10.5가 아닌 클라이언트 10.50에 인쇄해야합니다.
MTK

2

lodash에서 ceil은 아마 최고입니다

_.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에서 소수점 뒤에 0이 오는 숫자 데이터 유형 값을 갖는 방법은 없습니다.

긴 대답 : 문자열을 반환하는 JavaScript 의 속성 toFixed또는 toPrecision기능입니다. 그 이유는 Number 데이터 유형이 a = 2.00과 같은 값을 가질 수 없기 때문에 항상 소수점 다음에 오는 0을 제거하기 때문입니다. 이것은 Number Datatype의 내장 특성입니다. JS에서 위를 달성하기 위해 우리는 두 가지 옵션이 있습니다

  1. 데이터를 문자열로 사용하거나
  2. 2.50-> 2.5의 끝에서 '0'으로 값이 잘 리도록 동의합니다. 소수점 이하 자릿수 0을 가질 수 없습니다

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

그 가치는 다음과 같습니다. 십진수는 십진수입니다. 다른 값으로 반올림하거나하지 않습니다. 내부적으로 부동 소수점 arthetic 및 처리 규칙에 따라 소수점 이하 자릿수에 가깝습니다. 표시하려는 자릿수에 관계없이 내부적으로 십진수 (JS의 부동 소수점 두 배)로 유지됩니다.

디스플레이 용으로 표시하기 위해 문자열 변환으로 원하는 디스플레이 정밀도를 선택할 수 있습니다. 프레젠테이션은 저장 문제가 아니라 표시 문제입니다.


0

.toFixed ()를 사용하여 float 값 2 자리에 사용할 수 있습니다

예심

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);
}

-1

간단한 JavaScript, 부동 문자열

var it_price = chief_double($("#ContentPlaceHolder1_txt_it_price").val());

function chief_double(num){
    var n = parseFloat(num);
    if (isNaN(n)) {
        return "0";
    }
    else {
        return parseFloat(num);
    }
}


-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 round ()를 사용하려고 시도했지만 작동하지 않았습니다. 아마도 사람들이 투표를 거부하는 이유 일 것입니다. 그는 Math.round ()를 참조하고있을 수도 있습니다
Nathan Nathan

parseFloat()@Nathan @zsalzbank의 답변을 업데이트 한 후 인라인 으로 사용해야합니다.
Alastair

3
아니요, 작동하지 않습니다. Math.round (parseFloat (yourString), 2); 시도해 볼 수 있습니다
Augie Gardner

1
결코 효과가없는 답을 공감하지 않는 이유는 무엇입니까? round()js의 숫자 와 같은 방법은 없습니다 . 진짜 질문은 누가 이것을지지했는지입니다.
meandre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.