JavaScript의 모든 숫자는 배정 밀도 부동 소수점입니다. JavaScript에서 double을 float로 변환하려면 어떻게해야합니까? 나는 정밀 손실을 이해하지만 그것은 용납 될 수있다.JavaScript에서 double에서 float으로?
나는 소수점 숫자 부동 C 스타일을 묘사 할 필요가
JavaScript의 모든 숫자는 배정 밀도 부동 소수점입니다. JavaScript에서 double을 float로 변환하려면 어떻게해야합니까? 나는 정밀 손실을 이해하지만 그것은 용납 될 수있다.JavaScript에서 double에서 float으로?
나는 소수점 숫자 부동 C 스타일을 묘사 할 필요가
이 현대 엔진에서 작동합니다 : 결과의 데이터 유형은 수 (배정 밀도)이 여전히
function doubleToFloat (d) {
if (Float32Array)
return new Float32Array([d])[0];
}
하는 것으로 만 만 32 비트의 정보를 사용합니다. 내가 Float32Array를 사용할 수없는 경우에 대한 대체를 추가 :
function doubleToFloat (d) {
if (Float32Array)
return new Float32Array([ d ])[ 0 ];
if (d === 0)
return d;
var sign = 2*(d >= 0) - 1;
var b = Math.abs(d).toString(2);
var decimalIndex = b.indexOf('.');
var oneIndex = b.indexOf('1');
var exponent, mantissa, round, result;
if(decimalIndex === -1) {
exponent = b.length - 1;
mantissa = b.substr(1, 23);
round = +(mantissa.length === 23 && b[24] === '1');
result = sign*(parseInt('1' + mantissa, 2) + round)*Math.pow(2, exponent - mantissa.length);
} else if (decimalIndex === 1) {
exponent = 1 - oneIndex;
if (oneIndex === 0) {
mantissa = '1' + b.substr(2, 23);
round = +(mantissa.length === 24 && b[25] === '1');
result = sign*(parseInt(mantissa, 2) + round)*Math.pow(2, 1 - mantissa.length);
} else {
mantissa = b.substr(oneIndex, 24);
round = +(mantissa.length === 24 && b[oneIndex + 24] === '1');
result = sign*(parseInt(mantissa, 2) + round)*Math.pow(2, 1 + exponent - mantissa.length);
}
} else {
exponent = decimalIndex - 1;
mantissa = b.replace('.', '').substr(1, 23);
round = +(mantissa.length === 23 && b.replace('.', '')[24] === '1');
result = sign*(parseInt('1' + mantissa, 2) + round)*Math.pow(2, decimalIndex - mantissa.length - 1);
}
if (exponent < -126)
return 0;
if (exponent > 127)
return sign*Infinity;
return result;
}
한 가지 방법은 사용하는 것'새로운 Float32Array ([yourNumber]) [0]'하지만 모든 브라우저에서 지원되지 않는. 왜 잃어버린 정밀도가 필요한가요? – Xufox
"플로트"가 필요한 이유는 무엇입니까? 문맥은 우리가 당신이 가고있는 무슨을 이해할 것을 도울 것이다 – qxz
나는 C 작풍 부동 소수점 숫자를 묘사 할 필요가있다 – marc