JavaScript : 소수점 이하 자릿수로 반올림하지만 추가 0은 제거


85

여기에 시나리오입니다 : 내가지고있어 .9999999999999999내가 점점되어야 할 때 1.0.
소수점 이하 자릿수를 잃어 버릴 여유가 있으므로 .toFixed(15)어떤 종류의 작업을 사용하고 있습니다.

반올림이 작동하지만 문제는 내가 주어진 것 1.000000000000000입니다.
소수 자릿수로 반올림하는 방법이 있지만 여분의 공백을 제거하는 방법이 있습니까?

참고 : .toPrecision내가 원하는 것이 아닙니다. 소수점 뒤에 몇 개의 숫자 만 지정하고 싶습니다.
참고 2 : .toPrecision(1)소수점 뒤에 실제로 데이터가있는 숫자에 대해 높은 정밀도를 유지해야하기 때문에 사용할 수 없습니다 . 이상적으로는 필요한만큼 소수점 이하 자릿수가 있습니다 (최대 15 개).


요점은 .toFixed가 문자열을 반환하므로 숫자를 통해 라운드 트립 한 다음 문자열로 다시 돌아 가면 후행 0없이 다시 변환됩니다.
Neil

@Nathan : 설명을 위해. toFixed ()로 얻은 문자열 에서 후행 0을 제거 하시겠습니까?
Jiri Kriz 2011 년

답변:


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
단항 + 연산자를 사용하는 것이 parseFloat함수 보다 빠릅니다 . +number.toFixed(13)이 표현식은 1.0000000000000045에서와 같이 JavaScript 숫자 부정확성을 제거하는 데에도 사용할 수 있습니다.
ygoe


19

내가 이해했듯이을 통해 얻은 문자열에서 후행 0을 제거하고 싶습니다 toFixed(). 이것은 순수한 문자열 연산입니다.

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

6
정말 질문에 답한 건 당신뿐이에요 .. 감사합니다!
Mugen 2013 년

4
이것은 반올림 숫자에 점을 남깁니다 ( "100.00"=> "100.")
pckill

5
@pckill 점을 원하지 않는 경우 정규식에 포함시킬 수 있습니다 ( ...replace(/\.?0+$/, "");).
Zach Snow

즉 0에 실패하고 -0 때문에 0빈 문자열이된다 "", 그리고 -0이된다 -(추측에) 예상된다 어느 것도. @ zach-snow 제안 된 솔루션도 0과 -0에서 실패합니다.
robocat

@Mugen, Gus의 대답에 문제가 있었습니까?
trysis

9

Number(n.toFixed(15)) or +(n.toFixed(15)) 15 자리 십진수 문자열을 숫자로 변환하여 후행 0을 제거합니다.


1
내가 지적 할 것이라고 생각했지만 + (n.toFixed (...))는 parseFloat보다 훨씬 효율적입니다. 이유는 확실하지 않지만 Chrome의 Number보다 효율적입니다.
Domino

8

반환 값을 숫자로 캐스팅하면 후행 0이 삭제됩니다. 이것은 또한 현재보다 덜 장황 parseFloat()합니다.

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

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

이것은 단항 + 연산자 를 사용하므로 이것을 문자열 연산의 일부로 사용하는 경우 앞에 +가 있어야합니다 : var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));. 참고로 문자열 앞의 단항 +는 숫자로 변환합니다. MDN에서 : 단항 + 가능 :

정수 및 부동 소수점의 문자열 표현과 비 문자열 값 true, false 및 null을 변환합니다. 10 진수 및 16 진수 ( "0x"접두사) 형식의 정수가 지원됩니다. 음수가 지원됩니다 (16 진수는 아님). 특정 값을 구문 분석 할 수없는 경우 NaN으로 평가됩니다.


@robocat 방금 간단한 확인을했습니다. +(4.1).toFixed(4)4.1크롬 60 .
Константин Ван

이해가 안 돼요. 이 답변이 반대 투표를받은 이유는 무엇입니까?
Константин Ван

@K 당신이 맞았 기 때문에 이전 댓글을 삭제하고 답변에 추가했습니다. (단항 +를 올바르게 사용하는 것보다 lhs에 문자열과 함께 중위 +를 사용하고 있다고 생각합니다. 일반적으로 더 조심합니다! 건배)
robocat

이 답변은 NaN, Infinity, -Infinity, 3e30 및 0에서 여전히 작동합니다. 일부 다른 답변은 일부 코너 케이스에서 실패합니다.
robocat aug

(4) .toFixed (2) -> "4.00"크롬 60.0.3112.113에서
다니엘 케

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

참고 : 정규식은 다음 경우에만 작동합니다. places > 0

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


에 실패합니다 5e30(번호를로 변경 5e3). 코너 케이스는 사악합니다!
robocat

0

정밀도를 유지하고 0을 제거하는 더 나은 방법이 있습니다. 이것은 입력 번호를 취하고 일부 마술을 통해 후행 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()메서드number고정 소수점 표기법을 사용하여 형식 을 지정하고string .

반올림 전략을 적용합니다 .

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

설명했듯이, 실제로는 때때로 후행 0이 (잠재적으로 불필요하게) 발생합니다.

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

뒤에 오는 0을 없애고 싶지 않을 수도 있습니다. 기본적으로 number. 이를 수행하는 방법에는 여러 가지가 있습니다.

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

문자열을 숫자로 변환하는 다양한 방법에 대한 개요를 보려면 질문을 확인하십시오 . 여기에는 몇 가지 훌륭한 답변이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.