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

값이 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을 어떻게 표시합니까?



답변

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

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하므로 매우주의하십시오.


답변

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


답변

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

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”이 표시됩니다.


답변

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)


답변

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"


답변

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

이것은 19.66을 반환합니다


답변

간단 해

number = parseInt(number * 100)/100;