[javascript] Javascript : 반올림 된 숫자를 N 소수로 포맷
JavaScript에서 숫자를 소수점 이하 N 자리로 반올림하는 일반적인 방법은 다음과 같습니다.
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
그러나이 방법은 항상 N 소수점 이하 자릿수로 반올림하는 동안 최대 N 소수점 이하 자릿수로 반올림합니다. 예를 들어 “2.0”은 “2”로 반올림됩니다.
어떤 아이디어?
답변
그것은 반올림 ploblem이 아니라 디스플레이 문제입니다. 숫자는 유효 숫자에 대한 정보를 포함하지 않습니다. 값 2는 2.0000000000000과 같습니다. 반올림 된 값을 문자열로 바꾸면 특정 자릿수를 표시하게됩니다.
다음과 같이 숫자 뒤에 0을 추가 할 수 있습니다.
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(이는 클라이언트의 지역 설정에서 마침표를 소수점 구분 기호로 사용한다고 가정하고 코드가 다른 설정에 대해 작동하려면 더 많은 작업이 필요합니다.)
답변
여기에 주어진 모든 것에 대해 더 간단한 접근법이 있다고 생각하며 Number.toFixed()
이미 JavaScript로 구현 된 방법 입니다.
간단히 작성하십시오.
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
기타…
답변
방법을 찾았습니다. 다음은 수정 된 Christoph의 코드입니다.
function toFixed(value, precision) {
var precision = precision || 0,
power = Math.pow(10, precision),
absValue = Math.abs(Math.round(value * power)),
result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));
if (precision > 0) {
var fraction = String(absValue % power),
padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
result += '.' + padding + fraction;
}
return result;
}
“+ 1″을 추가 한 이유가 궁금하다면 여기 에서 배열 생성자를 사용하여 문자를 반복하는 방법에 대한 자세한 내용을 읽어보십시오 .
답변
일을하는 데 항상 더 나은 방법이 있습니다.
var number = 51.93999999999761;
4 자리 정밀도를 얻고 싶습니다 : 51.94
그냥 해:
number.toPrecision(4);
결과는 51.94입니다.
답변
PHP와 유사한 반올림 방법
아래 코드는 정밀도 매개 변수를 사용하는 고유 한 버전의 Math.round를 고유 한 네임 스페이스에 추가하는 데 사용할 수 있습니다. 위의 예에서 십진수 반올림과 달리 이것은 문자열과의 변환을 수행하지 않으며 정밀도 매개 변수는 PHP 및 Excel과 동일한 방식으로 작동합니다. 따라서 양수 1은 소수점 1 자리로 반올림하고 -1은 10 자리로 반올림합니다.
var myNamespace = {};
myNamespace.round = function(number, precision) {
var factor = Math.pow(10, precision);
var tempNumber = number * factor;
var roundedTempNumber = Math.round(tempNumber);
return roundedTempNumber / factor;
};
myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230
답변
제대로 작동하는 코드 (많은 테스트를하지 않음) :
function toFixed(value, precision) {
var precision = precision || 0,
neg = value < 0,
power = Math.pow(10, precision),
value = Math.round(value * power),
integral = String((neg ? Math.ceil : Math.floor)(value / power)),
fraction = String((neg ? -value : value) % power),
padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
return precision ? integral + '.' + padding + fraction : integral;
}
답변
아래 기능이 도움이 될 수 있다고 생각합니다.
function roundOff(value,round) {
return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}
사용법 : roundOff(600.23458,2);
반환됩니다600.23