여기에 뭔가 빠졌습니까?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
왜 않는.toFixed()
문자열을 반환?
숫자를 소수점 이하 두 자리로 반올림하고 싶습니다.
여기에 뭔가 빠졌습니까?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
왜 않는.toFixed()
문자열을 반환?
숫자를 소수점 이하 두 자리로 반올림하고 싶습니다.
답변:
이진 부동 소수점 시스템에서는 0.1과 10 진수 분수를 표시하는 데 사용되는 제곱을 표현할 수 없기 때문에 문자열을 반환합니다.
예를 들어 0.1은 실제로 0.1000000000000000055511151231257827021181583404541015625이고 0.01은 실제로 0.01000000000000000020816681711721685132943093776702880859375입니다. ( BigDecimal
내 요점을 증명해 주셔서 감사합니다 . :-P)
따라서 (소수점 부동 소수점 또는 유리수 유형 없음) 문자열로 출력하는 것이 표시에 필요한 정밀도로 정확하게자를 수있는 유일한 방법입니다.
toFixed
서식 지정 함수는 숫자를 문자열로 변환하고 지정된 소수 자릿수를 사용하여 서식을 지정하는 유일한 목적을 가지고 있습니다. 문자열을 반환하는 이유는 문자열을 반환해야하기 때문이며 toStringFixed
대신 이름이 지정된 경우 OP는 결과에 놀라지 않을 것입니다. 여기서 유일한 문제는 OP가 Math.round
JS 참조를 참조하지 않고 와 같이 작동 할 것으로 예상한다는 것 입니다.
Number.prototype.toFixed
숫자 를 인쇄하기 전에 형식을 지정 하도록 설계된 기능입니다 . 그것은 가족 출신 toString
, toExponential
그리고toPrecision
.
숫자를 반올림하려면 다음을 수행하십시오.
someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;
// if you need 3 digits, replace 1e2 with 1e3 etc.
// or just copypaste this function to your code:
function toFixedNumber(num, digits, base){
var pow = Math.pow(base||10, digits);
return Math.round(num*pow) / pow;
}
.
당신이 "원하는 경우 또는 원시와 같은 "기능을, 당신은 프로토 타입을 확장 할 수 있습니다 :
Number.prototype.toFixedNumber = function(digits, base){
var pow = Math.pow(base||10, digits);
return Math.round(this*pow) / pow;
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;
//or even hexadecimal
someNumber = 0xAF309/256 //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";
그러나 모듈에는 부작용이 없어야 모듈을 작성할 때 프로토 타입을 오염시키는 것이 좋지 않은 것으로 간주됩니다. 따라서 모듈의 경우 첫 번째 함수를 사용하십시오 .
type Number
입니다. IDE가이 기능을 문제는 +(anyValue)
항상 숫자를 반환 한다는 것입니다 . +("45")
반환 45
, +(new Number(42))
반환 42
. 그것은 함수를 강력하게 타이핑하는 것과 같습니다. 습관을 들이면 많은 버그를 피할 수 있습니다. :)
someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
아니다 42.01
, 그것은이다 ~42.0099999999999980
. 이유 : 숫자 42.01
가 존재하지 않으며 가장 가까운 기존 숫자로 반올림됩니다. btw, 증명 번호 toPrecision(18)
로 모든 관련 숫자로 인쇄하십시오.
이것을 변경 하여이 문제를 해결했습니다.
someNumber = someNumber.toFixed(2)
...이에:
someNumber = +someNumber.toFixed(2);
그러나 이것은 숫자를 문자열로 변환하고 다시 구문 분석하여 성능에 큰 영향을 미칩니다. 성능이나 유형 안전에 관심이 있다면 다른 답변도 확인하십시오.
someNumber = Math.round(someNumber * 1e2) / 1e2
! 더 일반적인 방법은 내 대답을 참조하십시오.
왜 사용하지 parseFloat
않습니까?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
주요 용도는 숫자를 표시하기 때문입니까? 숫자를 반올림하려면 Math.round()
적절한 요소를 사용하십시오.
'42'
숫자 방식으로 만 ... 그렇지 않습니다. 문자열에 숫자가 포함되어 있기 때문에 숫자 만 만들지는 않습니다. 이것은 PHP가 아닙니다. :-P
m93a
제공 되는 답변의 기능 버전이 약간 더 있습니다 .
const toFixedNumber = (toFixTo = 2, base = 10) => num => {
const pow = Math.pow(base, toFixTo)
return +(Math.round(num * pow) / pow)
}
const oneNumber = 10.12323223
const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123
// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12