문제

JavaScript에서는 숫자를 N -N 이하 자리로 반올림하는 일반적인 방법은 다음과 같습니다.

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));

그러나이 접근법은 a로 반올림됩니다 최고 내가 원하는 동안 N 이하 자리의 언제나 소수점 이하까지. 예를 들어 "2.0"은 "2"로 반올림됩니다.

어떤 아이디어?

도움이 되었습니까?

해결책

그것은 반올림이 아니라 디스플레이 문제입니다. 숫자에는 중요한 숫자에 대한 정보가 포함되어 있지 않습니다. 값 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 버전의 Math.Round를 자신의 네임 스페이스에 추가하여 정밀 매개 변수를 사용하는 데 사용될 수 있습니다. 위의 예에서 소수점 반올림과 달리, 이것은 문자열로의 전환을 수행하지 않으며, 정밀 매개 변수는 PHP 및 Excel과 동일한 방식으로 작동하여 양수 1은 10 진수에서 1 점으로, -1은 수십에서 반올림됩니다.

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 ()에 대한 Mozilla 개발자 참조

희망적으로 작동 코드 (많은 테스트를 수행하지 않음) :

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

이것은 n 자리로 반올림하는 데 효과적입니다 (n 자리 숫자로 잘라내려면 Math.round Call을 제거하고 Math.Trunc One을 사용하십시오) :

function roundN(value, digits) {
   var tenToN = 10 ** digits;
   return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}

내가 저작 할 때 과거에 Java에서 그러한 논리에 의지해야했습니다. 데이터 조작 e- 슬레이트 구성 요소. 그것은 0에 0.1을 0에 추가하면 예기치 않은 긴 소수점 부분으로 끝날 것이라는 사실을 알게 된 이래로 (이것은 부동 소수점 산술 때문입니다).

사용자 댓글 항상 2 진수 자리를 표시하는 형식 번호 이 기술 스케일링을 호출합니다.

일부는 예상대로 둥글 지 않은 사례가 있다고 언급합니다. http://www.jacklmoore.com/notes/rounding-in-javascript/ 대신 제안됩니다.

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}

다음은 JavaScript Sprintf에 대한 링크입니다.

http://www.webtoolkit.info/javaScript-sprintf.html

Sprintf ()에 대한 호출은 Perl의 하나의 반올림 방법론이지만 JavaScript에는 기본적으로 기능이 없습니다.

http://perldoc.perl.org/functions/sprintf.html

그게 도움이 되나요?

아래 기능이 도움이 될 수 있다고 생각합니다

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

반올림에 관심이없는 경우, 두 개의 토픽이있는 (x)를 추가 한 다음 필요한 경우 트레일 링 0과 점을 제거하십시오. 빠른 해결책이 아닙니다.

function format(value, decimals) {
    if (value) {
        value = value.toFixed(decimals);            
    } else {
        value = "0";
    }
    if (value.indexOf(".") < 0) { value += "."; }
    var dotIdx = value.indexOf(".");
    while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's

    return value;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top