[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

에서 ) (Math.round에 대한 모질라 개발자 참조


답변

제대로 작동하는 코드 (많은 테스트를하지 않음) :

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