내 코드를 소수점 이하 두 자리로 반올림합니다. 그러나 나는 10.8, 2.4 등의 숫자를 얻습니다. 이들은 소수점 이하 두 자리에 대한 아이디어가 아니므로 어떻게 다음을 개선 할 수 있습니까?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
10.80, 2.40 등과 같은 숫자를 원합니다. jQuery를 사용하면 좋습니다.
답변
고정 소수점 표기법을 사용하여 숫자를 포맷하려면 toFixed 메소드 를 사용하면 됩니다.
(10.8).toFixed(2); // "10.80"
var num = 2.4;
alert(num.toFixed(2)); // "2.40"
toFixed()
문자열 을 반환합니다.
중요 : toFixed는 90 %의 시간을 반올림하지 않으며 반올림 된 값을 반환하지만 대부분의 경우 작동하지 않습니다.
예를 들어 :
2.005.toFixed(2) === "2.00"
최신 정보:
요즘에는 Intl.NumberFormat
생성자를 사용할 수 있습니다 . ECMAScript 국제화 API 사양 (ECMA402) 의 일부입니다 . 그것은이 꽤 좋은 브라우저 지원 도 IE11을 포함, 그것은되어 완전히 Node.js를 지원 .
const formatter = new Intl.NumberFormat('en-US', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
});
console.log(formatter.format(2.005)); // "2.01"
console.log(formatter.format(1.345)); // "1.35"
toLocaleString
내부적으로 Intl
API 를 사용하는 메소드를 대신 사용할 수 있습니다 .
const format = (num, decimals) => num.toLocaleString('en-US', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
});
console.log(format(2.005)); // "2.01"
console.log(format(1.345)); // "1.35"
이 API는 또한 천 단위 구분 기호, 통화 기호 등과 같이 서식을 지정할 수있는 다양한 옵션을 제공합니다.
답변
이 주제는 오래된 주제이지만 여전히 최상위 Google 결과이며 제공되는 솔루션은 동일한 부동 소수점 10 진수 문제를 공유합니다. MDN 덕분에 내가 사용하는 (매우 일반적인) 기능은 다음과 같습니다 .
function round(value, exp) {
if (typeof exp === 'undefined' || +exp === 0)
return Math.round(value);
value = +value;
exp = +exp;
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));
// Shift back
value = value.toString().split('e');
return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}
우리가 볼 수 있듯이 다음과 같은 문제는 발생하지 않습니다.
round(1.275, 2); // Returns 1.28
round(1.27499, 2); // Returns 1.27
이 일반성은 멋진 것들도 제공합니다.
round(1234.5678, -2); // Returns 1200
round(1.2345678e+2, 2); // Returns 123.46
round("123.45"); // Returns 123
이제 OP의 질문에 대답하려면 다음을 입력해야합니다.
round(10.8034, 2).toFixed(2); // Returns "10.80"
round(10.8, 2).toFixed(2); // Returns "10.80"
또는보다 간결하고 덜 일반적인 기능의 경우 :
function round2Fixed(value) {
value = +value;
if (isNaN(value))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + 2) : 2)));
// Shift back
value = value.toString().split('e');
return (+(value[0] + 'e' + (value[1] ? (+value[1] - 2) : -2))).toFixed(2);
}
당신은 그것을 호출 할 수 있습니다 :
round2Fixed(10.8034); // Returns "10.80"
round2Fixed(10.8); // Returns "10.80"
다양한 예제와 테스트 ( @ tj-crowder 덕분에 !) :
답변
나는 보통 이것을 내 개인 라이브러리에 추가하고 @TIMINeutron 솔루션을 사용하고 몇 가지 길이를 사용하여 소수 길이에 적합하게 만들면 가장 적합합니다.
function precise_round(num, decimals) {
var t = Math.pow(10, decimals);
return (Math.round((num * t) + (decimals>0?1:0)*(Math.sign(num) * (10 / Math.pow(100, decimals)))) / t).toFixed(decimals);
}
보고 된 예외에 대해 작동합니다.
답변
이전 답변에 주석을 추가 할 수없는 이유를 모르겠지만 (아마도 나는 장님, 맹목적이지만) @Miguel의 답변을 사용하여 해결책을 찾았습니다.
function precise_round(num,decimals) {
return Math.round(num*Math.pow(10, decimals)) / Math.pow(10, decimals);
}
그리고 @bighostkim과 @Imre의 두 가지 의견 :
precise_round(1.275,2)
1.28을 반환하지 않는 문제precise_round(6,2)
6.00을 반환하지 않는 문제 (원하는대로).
나의 마지막 해결책은 다음과 같습니다.
function precise_round(num,decimals) {
var sign = num >= 0 ? 1 : -1;
return (Math.round((num*Math.pow(10,decimals)) + (sign*0.001)) / Math.pow(10,decimals)).toFixed(decimals);
}
보시다시피, 나는 약간의 “수정”을 추가해야했습니다. 그것은 그것이 아닙니다. 그러나 Math.round는 손실이 있기 때문에-당신은 jsfiddle.net에서 그것을 확인할 수 있습니다-이것이 “수정 방법을 아는 유일한 방법입니다” “)). 이미 채워진 숫자에 0.001을 더하므로 소수점 오른쪽에 1
3 0
을 더합니다. 따라서 사용하는 것이 안전해야합니다.
그 후 나는 .toFixed(decimal)
항상 올바른 형식으로 올바른 숫자를 출력하도록 추가 했습니다.
그래서 그것은 거의 다입니다. 잘 사용하십시오;)
편집 : 음수의 “수정”에 기능이 추가되었습니다.
답변
100 % 확신하는 한 가지 방법은 소수점 이하 자릿수 2 개를 얻는 것입니다.
(Math.round(num*100)/100).toFixed(2)
이로 인해 반올림 오류가 발생하면 James가 주석에서 설명한대로 다음을 사용할 수 있습니다.
(Math.round((num * 1000)/10)/100).toFixed(2)
답변
toFixed (n)은 소수점 다음에 n 길이를 제공합니다. toPrecision (x)는 x 총 길이를 제공합니다.
아래이 방법을 사용하십시오
// Example: toPrecision(4) when the number has 7 digits (3 before, 4 after)
// It will round to the tenths place
num = 500.2349;
result = num.toPrecision(4); // result will equal 500.2
그리고 숫자를 고정 사용하려면
result = num.toFixed(2);
답변
이 문제에 대한 정확한 해결책을 찾지 못했기 때문에 내 자신을 만들었습니다.
function inprecise_round(value, decPlaces) {
return Math.round(value*Math.pow(10,decPlaces))/Math.pow(10,decPlaces);
}
function precise_round(value, decPlaces){
var val = value * Math.pow(10, decPlaces);
var fraction = (Math.round((val-parseInt(val))*10)/10);
//this line is for consistency with .NET Decimal.Round behavior
// -342.055 => -342.06
if(fraction == -0.5) fraction = -0.6;
val = Math.round(parseInt(val) + fraction) / Math.pow(10, decPlaces);
return val;
}
예 :
function inprecise_round(value, decPlaces) {
return Math.round(value * Math.pow(10, decPlaces)) / Math.pow(10, decPlaces);
}
function precise_round(value, decPlaces) {
var val = value * Math.pow(10, decPlaces);
var fraction = (Math.round((val - parseInt(val)) * 10) / 10);
//this line is for consistency with .NET Decimal.Round behavior
// -342.055 => -342.06
if (fraction == -0.5) fraction = -0.6;
val = Math.round(parseInt(val) + fraction) / Math.pow(10, decPlaces);
return val;
}
// This may produce different results depending on the browser environment
console.log("342.055.toFixed(2) :", 342.055.toFixed(2)); // 342.06 on Chrome & IE10
console.log("inprecise_round(342.055, 2):", inprecise_round(342.055, 2)); // 342.05
console.log("precise_round(342.055, 2) :", precise_round(342.055, 2)); // 342.06
console.log("precise_round(-342.055, 2) :", precise_round(-342.055, 2)); // -342.06
console.log("inprecise_round(0.565, 2) :", inprecise_round(0.565, 2)); // 0.56
console.log("precise_round(0.565, 2) :", precise_round(0.565, 2)); // 0.57