반올림하지 않고 숫자를 소수점 이하 두 자리로 자릅니다.


196

값이 15.7784514라고 가정하고 반올림하지 않고 15.77을 표시하려고합니다.

var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));

결과-

15.8
15.78
15.778
15.7784514000 

15.77을 어떻게 표시합니까?


3
반올림을 원하지 않는 이유는 무엇입니까?
어딘가에

39
통화를 표시 할 때 유용합니다.
Richard Ye

@ mik01aj-통화를 표시 할 때 반올림하지 않고 계산 된 값을 자르는 것이 더 일반적입니다. 예를 들어, 미국의 세금 양식은 대부분 계산 된 분수 센트가 아니라 잘립니다. 이 경우 잘린 값이 올바른 값입니다.
Steven Byks

4
@CamiloMartin은 14 억 4 천만 달러와 10 억 달러의 부채 사이에 큰 차이가 있습니다.
Broda Noel

3
15 억 4 천만 달러와 15 억 5 천만 달러 사이에는 큰 차이가 있습니다. 1 억 달러입니다.
Liga

답변:


228

숫자를 문자열로 변환하고 숫자를 소수점 둘째 자리까지 일치시킵니다.

function calc(theform) {
    var num = theform.original.value, rounded = theform.rounded
    var with2Decimals = num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]
    rounded.value = with2Decimals
}
<form onsubmit="return calc(this)">
Original number: <input name="original" type="text" onkeyup="calc(form)" onchange="calc(form)" />
<br />"Rounded" number: <input name="rounded" type="text" placeholder="readonly" readonly>
</form>

toFixed방법은 경우와 달리 실패 toString하므로 매우주의하십시오.


22
+1 반올림 문제를 해결해야합니다. 내가 사용하는 위의 출력을 여전히 결과를 거라고 toFixed그렇게하지만, : (Math.floor(value * 100) / 100).toFixed(2). 아시다시피, 부동 소수점 값에서 이상한 정밀도가 발생할 수 있습니다 (그리고 스펙트럼의 다른 쪽에서는 숫자가 발생 15하면 OP가 원하는 것처럼 들립니다 15.00).
TJ Crowder

1
hehe, 또는 둘 다 결합한 경우 :Number((15.7784514000*100).toString().match(/^\d+/)/100);
skobaljic

27
value = 4.27이 심각하다면 Math.floor (value * 100) / 100이 작동하지 않습니다.
다크 하마

3
@DarkHippo 4.27이 실제로 4.26999999999이므로 Math.round는 일반적으로 원래 질문에 대한 대답은 아니지만 더 나은 솔루션입니다. 실제로 출력에 문자열이 주어지면 모든 부동 소수점 foible가있는 숫자 솔루션 대신 문자열 조작을 사용하여 수행해야합니다.
BJury

3
... 잘 들리지 않습니다. 어떤 상황에서도 유형 간 변환은 원형 교차로이며 안전하지 않은 것 같습니다. 정말 진보 된 프로그래머가 "모든 유형은 스트림 일뿐"이라고 주장하지 않는 한.
JackHasaKeyboard

66

2016 년 11 월 5 일 업데이트

항상 정확한 새로운 답변

function toFixed(num, fixed) {
    var re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?');
    return num.toString().match(re)[0];
}

으로 자바 스크립트에서 부동 소수점 연산을하는 것은 항상 가장자리 케이스를해야합니다, 이전 솔루션은 좋은 것만으로는 충분하지 않습니다 대부분의 시간을 정확합니다. 이와 같은 솔루션 num.toPrecision에는 BigDecimal.jsaccounting.js가 있습니다. 그러나 문자열을 파싱하는 것이 가장 간단하고 항상 정확하다고 생각합니다.

@Gumbo의 승인 된 답변에서 잘 작성된 정규식을 기반으로 한이 새로운 고정 기능은 항상 예상대로 작동합니다.


항상 정확한 답변은 아닙니다.

고정 된 기능으로 롤업 :

function toFixed(num, fixed) {
    fixed = fixed || 0;
    fixed = Math.pow(10, fixed);
    return Math.floor(num * fixed) / fixed;
}

7
toFixed (4.56, 2) = 4.55
울다

2
이 많은 답변은 Math.floor () 함수 안에 곱셈이 있습니다. 이것은 일부 숫자에서 실패합니다! 부동 소수점 산술은 정확하지 않으므로 다른 방법을 사용해야합니다.
니코 웨스터 데일

1
함수 toFixedCustom (num, fixed) {var re = new RegExp ( '^-? \\ d + (? : \. \\ d {0,'+ (fixed || -1) + '})?'); if (num.toString (). match (re)) {return num.toString (). match (re) [0]; }}
Ryan Augustine

1
javascript가 과학적 표기법으로 나타낼만큼 크거나 작은 숫자에 대해서는 업데이트 된 답변이 실패합니다. toFixed(0.0000000052, 2)'5.2'를 산출합니다. 이것은 사용하여 고정 할 수 있습니다 return num.toFixed(fixed+1).match(re)[0];다음 정규식 일치 실행, 반올림 방지하기 위해 대상 위에 소수의 장소에서는 toFixed 사용하고 공지 사항 I를
Netherdan

34

대신 문자열로 나머지를 수동으로 제거하기 위해 이것을 작성하기로 결정 했으므로 숫자와 함께 제공되는 수학 문제를 처리 할 필요가 없습니다.

num = num.toString(); //If it's not already a String
num = num.slice(0, (num.indexOf("."))+3); //With 3 exposing the hundredths place
Number(num); //If you need it back as a Number

그러면 숫자 = 15.7784514 인 "15.77"이 표시됩니다.


5
소수점을 강제하지 않으면 정수가 발생할 경우 조건을 추가 할 수 있습니다. 다음과 같이 : num = num.toString (); if (num.indexOf ( ".")> 0) {num = num.slice (0, (num.indexOf ( ".")) + 3)}; 수 (num);
벤 노스케

1
소수가 있으면 좋지만 정수이면 실패합니다.
Ruslan López

숫자가 0.00000052이면 5.2e를 얻는 것이 잘못 될 것입니다.
Vasanth

1
@Vasanth 숫자가 0.00000052이면 "0.00"을 반환합니다. 아마 답변이 편집 된 이후 것입니다
Drenai

네, 에지 케이스에서는 실패합니다
VPaul

18

2017 년 10 월

숫자를 n 번째 10 진수로 자르고 (반올림하지 않음) n≥0 인 경우 정확히 n 개의 10 진수가있는 문자열로 변환하는 일반적인 솔루션입니다.

function toFixedTrunc(x, n) {
  const v = (typeof x === 'string' ? x : x.toString()).split('.');
  if (n <= 0) return v[0];
  let f = v[1] || '';
  if (f.length > n) return `${v[0]}.${f.substr(0,n)}`;
  while (f.length < n) f += '0';
  return `${v[0]}.${f}`
}

여기서 x는 숫자 (문자열로 변환 됨) 또는 문자열 일 수 있습니다.

다음은 n = 2에 대한 몇 가지 테스트입니다 (OP에서 요청한 테스트 포함).

0           => 0.00
0.01        => 0.01
0.5839      => 0.58
0.999       => 0.99
1.01        => 1.01
2           => 2.00
2.551       => 2.55
2.99999     => 2.99
4.27        => 4.27
15.7784514  => 15.77
123.5999    => 123.59
0.000000199 => 1.99 *

참고에 언급 된 바와 같이, 이는 "1.99e-7"및 다른 n 값에 대한 지수로의 자바 스크립트 암시 적 변환 때문입니다.

15.001097   => 15.0010 (n=4)
0.000003298 => 0.0000032 (n=7)
0.000003298257899 => 0.000003298257 (n=12)

2
toFixedTrunc(0.000000199, 2) // 1.99
Maharramoff

1
@ShamkhalMaharramov : 개발 콘솔을 열고 0.000000199를 입력하면 무엇을 얻습니까? 1.99e-7을 얻습니다. 또한 0.000000199.toString ()을 입력하면 무엇을 얻을 수 있습니까? "1.99e-7"을 얻습니다. 따라서 0.000000199를 함수에 전달하면 "0.000000199"가 아닌 "1.99e-7"에서 작동하고 "정확하게"는 "1.99"를 반환합니다. ecma-international.org/ecma-262/6.0/…
SC1000

13

parseInt가 Math.floor보다 빠릅니다.

function floorFigure(figure, decimals){
    if (!decimals) decimals = 2;
    var d = Math.pow(10,decimals);
    return (parseInt(figure*d)/d).toFixed(decimals);
};

floorFigure(123.5999)    =>   "123.59"
floorFigure(123.5999, 3) =>   "123.599"

2
1234567.89 실패
Ruslan López

로페즈를 설명해 주시겠습니까?
zardilior

3
floorFigure (4.56, 2) = 4.55
9:31에

7
num = 19.66752
f = num.toFixed(3).slice(0,-1)
alert(f)

이것은 19.66을 반환합니다


5
(4.9999) .toFixed (3) .slice (0, -1)은 5.00을 반환하며 예상 결과는 4.99입니다.
Bruno Lemos

1
대신 .toFixed (6) .slice (0, -4)와 같은 것을 사용하는 것이 좋습니다.
Bruno Lemos

그것은 완벽합니다. 제 경우에는 괜찮습니다. 예를 들어 소수를 하나만 원하면 num.toFixed (2) .slice (0, -1)을 사용하십시오 (num에 1.2356이 있으면 1.2를 반환 함)
Esteban Perez


5

이 솔루션은 작동하지만 불필요하게 복잡해 보입니다. 나는 개인적으로 모듈러스 연산자를 사용하여 나머지 나눗셈 연산을 얻고 제거합니다. 그 숫자가 15.7784514라고 가정하면 :

num-=num%.01;

이것은 num = num-(num % .01)을 말하는 것과 같습니다.


흥미로운 Nijkokun입니다. 지적 해 주셔서 감사합니다. 나는이 기술을 사용하여 문제가 발생하지 않았지만 분명히 이와 같은 인스턴스를 자세히 살펴 봐야합니다. 대안으로이 문제를 해결하는 ((num * = 100)-(num % 1)) / 100을 사용할 수 있습니다. 필자의 경우 우선 순위는 내가 적용하는 계산의 양 때문에 실행 속도이며, 이것이 내가 찾은 가장 빠른 방법입니다.
jtrick 2019

1
요점은 제공된 다른 솔루션에 필요한 객체 및 기능 조회 및 변환을 피하는 것이 었습니다. 피드백 감사드립니다!
jtrick

1
또한 -5 제외 실패
루슬란 로페즈

또한 빠른 반올림에 관심이 있습니다.이 코드를 십진수 1로 만드는 방법은 무엇입니까?
thednp

5

여기의 대답은 도움이되지 않았습니다. 반올림하거나 계속 잘못된 소수점을 제공했습니다.

내 솔루션은 십진수를 문자열로 변환하고 문자를 추출 한 다음 모든 것을 숫자로 반환합니다.

function Dec2(num) {
  num = String(num);
  if(num.indexOf('.') !== -1) {
    var numarr = num.split(".");
    if (numarr.length == 1) {
      return Number(num);
    }
    else {
      return Number(numarr[0]+"."+numarr[1].charAt(0)+numarr[1].charAt(1));
    }
  }
  else {
    return Number(num);
  }  
}

Dec2(99); // 99
Dec2(99.9999999); // 99.99
Dec2(99.35154); // 99.35
Dec2(99.8); // 99.8
Dec2(10265.985475); // 10265.98

12

5

양수에 대한 내 버전 :

function toFixed_norounding(n,p)
{
    var result = n.toFixed(p);
    return result <= n ? result: (result - Math.pow(0.1,p)).toFixed(p);
}

빠르고 예쁘고 명백합니다. (양수 버전)


부동 소수점 값 (예 : 돈)에 대해서는 반올림이 필요했습니다. 위의 기능은이 주제의 "답변"이어야합니다. 매우 훌륭하고 매력처럼 작동합니다. 저자에게 감사하고 감사합니다. :)))
Adrian Tanase

음수 값에 실패했습니다. -0.7752. 테스트는 toFixed_norounding(-0.7752,2)반환 -0.78대신에-0.77
링 Loeng

4

다음 코드는 매우 효과적입니다.

num.toString().match(/.\*\\..{0,2}|.\*/)[0];

옵션으로 빼기 기호를 추가하여 완벽하게 만들 것입니다 -?.)
Ruslan López

3

나는 다음과 같은 간단한 방법으로 고정했다.

var num = 15.7784514;
Math.floor(num*100)/100;

결과는 15.77입니다


그것은 음수 값으로 -15.7784514는 작동하지 않습니다 : 반환-15.78
Clément Baconnier

3

숫자를 자르십시오.

function truncDigits(inputNumber, digits) {
  const fact = 10 ** digits;
  return Math.floor(inputNumber * fact) / fact;
}

3

또 다른 한 줄 솔루션 :

number = Math.trunc(number*100)/100

두 번째 숫자로 자르고 싶기 때문에 100을 사용했지만보다 유연한 솔루션은 다음과 같습니다.

number = Math.trunc(number*Math.pow(10, digits))/Math.pow(10, digits)

여기서 자리수는 유지할 소수 자릿수입니다.

자세한 내용과 브라우저 호환성에 대해서는 Math.trunc 사양 을 참조하십시오 .


1
IE11을 지원할 필요가없는 경우이 방법이 가장 적합합니다.
TJ.

2

여기 있어요. 문제를 해결하는 또 다른 방법을 보여주는 답변 :

// For the sake of simplicity, here is a complete function:
function truncate(numToBeTruncated, numOfDecimals) {
    var theNumber = numToBeTruncated.toString();
    var pointIndex = theNumber.indexOf('.');
    return +(theNumber.slice(0, pointIndex > -1 ? ++numOfDecimals + pointIndex : undefined));
}

최종 표현식 앞에 +를 사용하십시오. 그것은 잘린 슬라이스 문자열을 다시 숫자 타입으로 변환하는 것입니다.

그것이 도움이되기를 바랍니다!


1
나는이 접근 방식의 단순함을 좋아하며 수학 사용을 피하는 모든 솔루션이이 문제를 해결하는 데 더 적합하다고 생각합니다. 따라서 slice () 등을 사용하는 것이 올바른 방법입니다. 내 방법의 유일한 장점은 문자열 [따옴표로 묶은 [단일 / 이중]]으로 전달 된 숫자를 처리한다는 것입니다. 어떤 이유로 든 위의 함수에서 FF에서 오류가 발생했습니다. console.log ( 'truncate ( "0.85156", 2)', truncate ( "0.85156", 2));
Charles Robertson

2

0없이 자르기

function toTrunc(value,n){  
    return Math.floor(value*Math.pow(10,n))/(Math.pow(10,n));
}

또는

function toTrunc(value,n){
    x=(value.toString()+".0").split(".");
    return parseFloat(x[0]+"."+x[1].substr(0,n));
}

테스트:

toTrunc(17.4532,2)  //17.45
toTrunc(177.4532,1) //177.4
toTrunc(1.4532,1)   //1.4
toTrunc(.4,2)       //0.4

0으로 자르기

function toTruncFixed(value,n){
    return toTrunc(value,n).toFixed(n);
}

테스트:

toTrunc(17.4532,2)  //17.45
toTrunc(177.4532,1) //177.4
toTrunc(1.4532,1)   //1.4
toTrunc(.4,2)       //0.40

2

이것은 나를 위해 잘 작동했습니다. 문제가 해결되기를 바랍니다.

function toFixedNumber(number) {
    const spitedValues = String(number.toLocaleString()).split('.');
    let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
    decimalValue = decimalValue.concat('00').substr(0,2);

    return '$'+spitedValues[0] + '.' + decimalValue;
}

// 5.56789      ---->  $5.56
// 0.342        ---->  $0.34
// -10.3484534  ---->  $-10.34 
// 600          ---->  $600.00

function convertNumber(){
  var result = toFixedNumber(document.getElementById("valueText").value);
  document.getElementById("resultText").value = result;
}


function toFixedNumber(number) {
        const spitedValues = String(number.toLocaleString()).split('.');
        let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
        decimalValue = decimalValue.concat('00').substr(0,2);

        return '$'+spitedValues[0] + '.' + decimalValue;
}
<div>
  <input type="text" id="valueText" placeholder="Input value here..">
  <br>
  <button onclick="convertNumber()" >Convert</button>
  <br><hr>
  <input type="text" id="resultText" placeholder="result" readonly="true">
</div>


2

이를 수행하는 쉬운 방법은 다음이지만 amount 매개 변수가 문자열로 제공되는지 확인해야합니다.

function truncate(amountAsString, decimals = 2){
  var dotIndex = amountAsString.indexOf('.');
  var toTruncate = dotIndex !== -1  && ( amountAsString.length > dotIndex + decimals + 1);
  var approach = Math.pow(10, decimals);
  var amountToTruncate = toTruncate ? amountAsString.slice(0, dotIndex + decimals +1) : amountAsString;  
  return toTruncate
    ?  Math.floor(parseFloat(amountToTruncate) * approach ) / approach
    :  parseFloat(amountAsString);

}

console.log(truncate("7.99999")); //OUTPUT ==> 7.99
console.log(truncate("7.99999", 3)); //OUTPUT ==> 7.999
console.log(truncate("12.799999999999999")); //OUTPUT ==> 7.99

2

function formatLimitDecimals(value, decimals) {
  value = value.toString().split('.')

  if (value.length === 2) {
    return Number([value[0], value[1].slice(0, decimals)].join('.'))
  } else {
    return Number(value[0]);
  }
}

console.log(formatLimitDecimals(4.156, 2)); // 4.15
console.log(formatLimitDecimals(4.156, 8)); // 4.156
console.log(formatLimitDecimals(4.156, 0)); // 4


1

나는 (num-0.05).toFixed(1)두 번째 소수점을 얻는 데 사용 했습니다.


1

typescript 내 솔루션 (JS로 쉽게 이식 할 수 있음) :

/**
 * Returns the price with correct precision as a string
 *
 * @param   price The price in decimal to be formatted.
 * @param   decimalPlaces The number of decimal places to use
 * @return  string The price in Decimal formatting.
 */
type toDecimal = (price: number, decimalPlaces?: number) => string;
const toDecimalOdds: toDecimal = (
  price: number,
  decimalPlaces: number = 2,
): string => {
  const priceString: string = price.toString();
  const pointIndex: number = priceString.indexOf('.');

  // Return the integer part if decimalPlaces is 0
  if (decimalPlaces === 0) {
    return priceString.substr(0, pointIndex);
  }

  // Return value with 0s appended after decimal if the price is an integer
  if (pointIndex === -1) {
    const padZeroString: string = '0'.repeat(decimalPlaces);

    return `${priceString}.${padZeroString}`;
  }

  // If numbers after decimal are less than decimalPlaces, append with 0s
  const padZeroLen: number = priceString.length - pointIndex - 1;
  if (padZeroLen > 0 && padZeroLen < decimalPlaces) {
    const padZeroString: string = '0'.repeat(padZeroLen);

    return `${priceString}${padZeroString}`;
  }

  return priceString.substr(0, pointIndex + decimalPlaces + 1);
};

테스트 사례 :

  expect(filters.toDecimalOdds(3.14159)).toBe('3.14');
  expect(filters.toDecimalOdds(3.14159, 2)).toBe('3.14');
  expect(filters.toDecimalOdds(3.14159, 0)).toBe('3');
  expect(filters.toDecimalOdds(3.14159, 10)).toBe('3.1415900000');
  expect(filters.toDecimalOdds(8.2)).toBe('8.20');

개선 사항이 있습니까?


0

자신의 toFixed기능을 굴리십시오 Math.floor. 양수 값 은 잘 작동합니다.

function toFixed(num, fixed) {
    fixed = fixed || 0;
    fixed = Math.pow(10, fixed);
    return Math.floor(num * fixed) / fixed;
}

음수 값 Math.floor은 값의 반올림입니다. Math.ceil대신 사용할 수 있습니다 .

예,

Math.ceil(-15.778665 * 10000) / 10000 = -15.7786
Math.floor(-15.778665 * 10000) / 10000 = -15.7787 // wrong.

5
이 많은 답변은 Math.floor () 함수 안에 곱셈이 있습니다. 이것은 일부 숫자에서 실패합니다! 부동 소수점 산술은 정확하지 않으므로 다른 방법을 사용해야합니다.
니코 웨스터 데일

0

정규식을 사용하는 Gumbo의 두 번째 솔루션은 작동하지만 정규식으로 인해 느립니다. 부동 소수점 숫자의 부정확성으로 인해 특정 상황에서 Gumbo의 첫 번째 솔루션이 실패합니다. 참고 항목 JSFiddle을데모 및 벤치 마크 을 . 두 번째 솔루션은 현재 시스템 인 Intel Core i5-2500 CPU (3.30 GHz)에서 호출 당 약 1636 나노초가 소요됩니다.

내가 작성한 솔루션에는 부동 소수점 부정확성을 처리하기 위해 작은 보상을 추가하는 것이 포함됩니다. 기본적으로 순간, 즉 나노초 단위입니다. 통화 당 2 나노초 (nanoseconds)의 시간을 기록했지만 JavaScript 타이머는 매우 정확하거나 세분화되지 않았습니다. 다음은 JS Fiddle 과 코드입니다.

function toFixedWithoutRounding (value, precision)
{
    var factorError = Math.pow(10, 14);
    var factorTruncate = Math.pow(10, 14 - precision);
    var factorDecimal = Math.pow(10, precision);
    return Math.floor(Math.floor(value * factorError + 1) / factorTruncate) / factorDecimal;
}

var values = [1.1299999999, 1.13, 1.139999999, 1.14, 1.14000000001, 1.13 * 100];

for (var i = 0; i < values.length; i++)
{
    var value = values[i];
    console.log(value + " --> " + toFixedWithoutRounding(value, 2));
}

for (var i = 0; i < values.length; i++)
{
    var value = values[i];
    console.log(value + " --> " + toFixedWithoutRounding(value, 4));
}

console.log("type of result is " + typeof toFixedWithoutRounding(1.13 * 100 / 100, 2));

// Benchmark
var value = 1.13 * 100;
var startTime = new Date();
var numRun = 1000000;
var nanosecondsPerMilliseconds = 1000000;

for (var run = 0; run < numRun; run++)
    toFixedWithoutRounding(value, 2);

var endTime = new Date();
var timeDiffNs = nanosecondsPerMilliseconds * (endTime - startTime);
var timePerCallNs = timeDiffNs / numRun;
console.log("Time per call (nanoseconds): " + timePerCallNs);

0

David D의 답변을 바탕으로 :

function NumberFormat(num,n) {
  var num = (arguments[0] != null) ? arguments[0] : 0;
  var n = (arguments[1] != null) ? arguments[1] : 2;
  if(num > 0){
    num = String(num);
    if(num.indexOf('.') !== -1) {
      var numarr = num.split(".");
      if (numarr.length > 1) {
        if(n > 0){
          var temp = numarr[0] + ".";
          for(var i = 0; i < n; i++){
            if(i < numarr[1].length){
              temp += numarr[1].charAt(i);
            }
          }
          num = Number(temp);
        }
      }
    }
  }
  return Number(num);
}

console.log('NumberFormat(123.85,2)',NumberFormat(123.85,2));
console.log('NumberFormat(123.851,2)',NumberFormat(123.851,2));
console.log('NumberFormat(0.85,2)',NumberFormat(0.85,2));
console.log('NumberFormat(0.851,2)',NumberFormat(0.851,2));
console.log('NumberFormat(0.85156,2)',NumberFormat(0.85156,2));
console.log('NumberFormat(0.85156,4)',NumberFormat(0.85156,4));
console.log('NumberFormat(0.85156,8)',NumberFormat(0.85156,8));
console.log('NumberFormat(".85156",2)',NumberFormat(".85156",2));
console.log('NumberFormat("0.85156",2)',NumberFormat("0.85156",2));
console.log('NumberFormat("1005.85156",2)',NumberFormat("1005.85156",2));
console.log('NumberFormat("0",2)',NumberFormat("0",2));
console.log('NumberFormat("",2)',NumberFormat("",2));
console.log('NumberFormat(85156,8)',NumberFormat(85156,8));
console.log('NumberFormat("85156",2)',NumberFormat("85156",2));
console.log('NumberFormat("85156.",2)',NumberFormat("85156.",2));

// NumberFormat(123.85,2) 123.85
// NumberFormat(123.851,2) 123.85
// NumberFormat(0.85,2) 0.85
// NumberFormat(0.851,2) 0.85
// NumberFormat(0.85156,2) 0.85
// NumberFormat(0.85156,4) 0.8515
// NumberFormat(0.85156,8) 0.85156
// NumberFormat(".85156",2) 0.85
// NumberFormat("0.85156",2) 0.85
// NumberFormat("1005.85156",2) 1005.85
// NumberFormat("0",2) 0
// NumberFormat("",2) 0
// NumberFormat(85156,8) 85156
// NumberFormat("85156",2) 85156
// NumberFormat("85156.",2) 85156

0

반올림하지 않고 두 개의 부동 소수점을 얻는 것이 더 안정적입니다.

참조 답변

var number = 10.5859;
var fixed2FloatPoints = parseInt(number * 100) / 100;
console.log(fixed2FloatPoints);

감사합니다 !


0

이미 정규 표현식과 산술 계산에 대한 적절한 대답이 있습니다.

function myFunction() {
    var str = 12.234556; 
    str = str.toString().split('.');
    var res = str[1].slice(0, 2);
    document.getElementById("demo").innerHTML = str[0]+'.'+res;
}

// output: 12.23

0

여기 문자열로 무엇을 했습니까?

export function withoutRange(number) {
  const str = String(number);
  const dotPosition = str.indexOf('.');
  if (dotPosition > 0) {
    const length = str.substring().length;
    const end = length > 3 ? 3 : length;
    return str.substring(0, dotPosition + end);
  }
  return str;
}

0

이 모든 대답은 약간 복잡해 보입니다. 나는 당신의 숫자에서 0.5를 빼고 toFixed ()를 사용합니다.


0.005를 의미 했습니까?
Luan Nguyen

0

가장 효율적인 솔루션 (2 소수 자릿수)은 전화하기 전에 0.005를 빼는 것입니다 toFixed()

function toFixed2( num ) { return (num-0.005).toFixed(2) }

음수도 반올림됩니다 (0에서 멀어짐). OP는 음수에 대해서는 아무것도 말하지 않았습니다.


0

나는 이미 예제가 거의 없다는 것을 알고 있지만 String.toFixed와 동등한 것을 제안하는 것이 가치가 있다고 생각합니다. 일부는 도움이 될 수 있습니다.

그것은 내 toFixed 대안이며, 숫자를 반올림하지 않고, 자르거나 주어진 정밀도에 따라 0을 추가합니다. 여분의 긴 숫자의 경우 정밀도가 길 때 JS 내장 반올림을 사용합니다. 함수는 스택에서 찾은 모든 문제가있는 숫자에 작동합니다.

function toFixedFixed(value, precision = 0) {
    let stringValue = isNaN(+value) ? '0' : String(+value);

    if (stringValue.indexOf('e') > -1 || stringValue === 'Infinity' || stringValue === '-Infinity') {
        throw new Error('To large number to be processed');
    }

    let [ beforePoint, afterPoint ] = stringValue.indexOf('.') > -1 ? stringValue.split('.') : [ stringValue, ''];

    // Force automatic rounding for some long real numbers that ends with 99X, by converting it to string, cutting off last digit, then adding extra nines and casting it on number again
    // e.g. 2.0199999999999996: +('2.019999999999999' + '9999') will give 2.02
    if (stringValue.length >= 17 && afterPoint.length > 2 && +afterPoint.substr(afterPoint.length - 3) > 995) {
        stringValue = String(+(stringValue.substr(0, afterPoint.length - 1) + '9'.repeat(stringValue.split('.').shift().length + 4)));
        [ beforePoint, afterPoint ] = String(stringValue).indexOf('.') > -1 ? stringValue.split('.') : [ stringValue, ''];
    }

    if (precision === 0) {
        return beforePoint;
    } else if (afterPoint.length > precision) {
        return `${beforePoint}.${afterPoint.substr(0, precision)}`;
    } else {
        return `${beforePoint}.${afterPoint}${'0'.repeat(precision - afterPoint.length)}`;
    }
}

길이가 18 이상인 숫자의 경우 정밀도가 제대로 처리되지 않을 수 있습니다. 예를 들어 64 비트 Chrome은 숫자를 반올림하거나 "e +"/ "e-"를 추가하여 숫자의 길이를 18로 유지합니다.

실수로 연산을 수행하려면 Math.sqrt(10, precision)먼저 곱하고 계산 한 다음 곱셈기 값으로 다이빙하는 것이 더 안전 합니다.

예:

0.06 + 0.01이며 0.06999999999999999반올림하지 않는 모든 서식 함수는 0.06정밀도 를 위해 잘립니다 2.

그러나 multiplier & divider :와 동일한 작업을 수행하면을 (0.06 * 100 + 0.01 * 100) / 100얻을 수 0.07있습니다.

그래서 자바 스크립트에서 실수를 처리 할 때, 특히 돈을 계산할 때 이러한 승수 / 분배기를 사용하는 것이 중요합니다 ...

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