소수점 이하의 자바 스크립트에서 숫자를 1 자로 올릴 수 있습니까 (올바로 반올림)?
나는 * 10, round, 10을 시도했지만 int 끝에 두 개의 소수점을 남깁니다.
소수점 이하의 자바 스크립트에서 숫자를 1 자로 올릴 수 있습니까 (올바로 반올림)?
나는 * 10, round, 10을 시도했지만 int 끝에 두 개의 소수점을 남깁니다.
답변:
Math.round(num * 10) / 10
작품, 여기에 예가 있습니다 ...
var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3
소수점 이하 한 자리를 원한다면 0이더라도 추가하십시오 ...
var fixed = rounded.toFixed(1)
// fixed is always to 1 d.p.
// NOTE: .toFixed() returns a string!
// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros
// So, just make sure it is the last step before output,
// and use a number format during calculations!
이 원리를 사용하여 참고로 여기에 정밀한 작은 원형 함수가 있습니다 ...
function round(value, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(value * multiplier) / multiplier;
}
... 사용법 ...
round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7
... 기본적으로 가장 가까운 정수로 반올림합니다 (정밀도 0) ...
round(12345.6789) // 12346
... 가장 가까운 10 또는 100 등으로 반올림하는 데 사용할 수 있습니다 ...
round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300
... 음수의 올바른 처리 ...
round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5
... toFixed와 결합하여 일관되게 문자열 형식으로 지정할 수 있습니다 ...
round(456.7, 2).toFixed(2) // "456.70"
.toFixed()
숫자를 원할 때 문자열을 반환하므로 주의하십시오 .
parseFloat
하면 .toFixed()
정수 (0) 인 경우 남은 소수점을 제거 합니다. 일반적으로 수학을하려면 첫 번째 예를 따르는 것이 가장 좋습니다. UI에 숫자를 표시하려면을 사용하십시오 .toFixed()
.
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5
toFixed()
글리치가 있습니다-Chrome 브라우저에서을 호출 toFixed()
한 다음 문자열로 변환하면 10.00000000068
이상하게 보입니다 . 그래도 이것을 확실하게 재현 할 수 없습니다.
.toFixed()
그것은을 반환으로 String
당신은 어쩌면 할 때Number
사용 Math.round(5.01)
하면 5
대신에5.0
.
당신이 사용하는 경우 toFixed
하면 반올림 문제가 발생 합니다.
두 세계의 최고를 원한다면 두 가지를 결합하십시오.
(Math.round(5.01 * 10) / 10).toFixed(1)
이를 위해 함수를 생성 할 수 있습니다.
function roundedToFixed(_float, _digits){
var rounded = Math.pow(10, _digits);
return (Math.round(_float * rounded) / rounded).toFixed(_digits);
}
에 투표 toFixed()
하지만 레코드에 대해서는 비트 시프트를 사용하여 숫자를 int로 캐스팅하는 다른 방법이 있습니다. 따라서 항상 0으로 반올림합니다 (양수의 경우 아래로, 음수의 경우 위로).
var rounded = ((num * 10) << 0) * 0.1;
그러나 함수 호출이 없기 때문에 사악합니다. :)
다음은 문자열 일치를 사용하는 것입니다.
var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');
나는 문자열 변형을 사용하는 것을 권장하지 않습니다.
이것으로 시도하십시오 :
var original=28.453
// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100 //returns 28.45
// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10 //returns 28.5
// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000 //returns 8.111
덜 복잡하고 쉽게 구현할 수 있습니다 ...
이를 통해 다음과 같은 기능을 수행 할 수 있습니다.
function RoundAndFix (n, d) {
var m = Math.pow (10, d);
return Math.round (n * m) / m;
}
편집 : ROUND HALF UP을 사용하여 반올림하는 방법을 참조하십시오 . 우리 대부분이 초등학교에서 배운 반올림 모드
왜 그냥
let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
toPrecision 방법 사용 :
var a = 1.2345
a.toPrecision(2)
// result "1.2"
12.345.toPrecision( 2 )
입니다 "12"
.
누구나 원한다면 Little Angular 필터 :
angular.module('filters').filter('decimalPlace', function() {
return function(num, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(num * multiplier) / multiplier;
};
});
경유로 사용 :
{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}
:)
일반적으로 반올림은 스케일링에 의해 수행됩니다. round(num / p) * p
지수 표기법을 사용하면 + ve 숫자의 반올림을 올바르게 처리합니다. 그러나이 방법은 -ve edge 사례를 올바르게 반올림하지 못합니다.
function round(num, precision = 2) {
var scaled = Math.round(num + "e" + precision);
return Number(scaled + "e" + -precision);
}
// testing some edge cases
console.log( round(1.005, 2) ); // 1.01 correct
console.log( round(2.175, 2) ); // 2.18 correct
console.log( round(5.015, 2) ); // 5.02 correct
console.log( round(-1.005, 2) ); // -1 wrong
console.log( round(-2.175, 2) ); // -2.17 wrong
console.log( round(-5.015, 2) ); // -5.01 wrong
여기에 산술 반올림을 수행하기 위해 작성한 함수도 있습니다. 직접 테스트 할 수 있습니다.
/**
* MidpointRounding away from zero ('arithmetic' rounding)
* Uses a half-epsilon for correction. (This offsets IEEE-754
* half-to-even rounding that was applied at the edge cases).
*/
function RoundCorrect(num, precision = 2) {
// half epsilon to correct edge cases.
var c = 0.5 * Number.EPSILON * num;
// var p = Math.pow(10, precision); //slow
var p = 1; while (precision--> 0) p *= 10;
if (num < 0)
p *= -1;
return Math.round((num + c) * p) / p;
}
// testing some edge cases
console.log(RoundCorrect(1.005, 2)); // 1.01 correct
console.log(RoundCorrect(2.175, 2)); // 2.18 correct
console.log(RoundCorrect(5.015, 2)); // 5.02 correct
console.log(RoundCorrect(-1.005, 2)); // -1.01 correct
console.log(RoundCorrect(-2.175, 2)); // -2.18 correct
console.log(RoundCorrect(-5.015, 2)); // -5.02 correct
이것은 내가 던지는 모든 것에 안정적으로 작동하는 것 같습니다.
function round(val, multiplesOf) {
var s = 1 / multiplesOf;
var res = Math.ceil(val*s)/s;
res = res < val ? res + multiplesOf: res;
var afterZero = multiplesOf.toString().split(".")[1];
return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}
반올림하므로 사용 사례에 따라 수정해야 할 수도 있습니다. 이것은 작동해야합니다 :
console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1
나는 숫자 유형을 반환하고 필요한 경우에만 소수를 배치합니다 (0 패딩 없음).
예 :
roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10
roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9
코드:
function roundWithMaxPrecision (n, precision) {
return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}
정밀도 문제를 피할 수있는 방법을 찾았습니다.
function badRound (num, precision) {
const x = 10 ** precision;
return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1
function round (num, precision) {
const x = 10 ** (precision + 1);
const y = 10 ** precision;
return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01
Math.round(n * 10) / 10
작동합니다. 코드가 뭐야?