2016-08-04 5 views
0

JavaScript의 모든 숫자는 배정 밀도 부동 소수점입니다. JavaScript에서 double을 float로 변환하려면 어떻게해야합니까? 나는 정밀 손실을 이해하지만 그것은 용납 될 수있다.JavaScript에서 double에서 float으로?

나는 소수점 숫자 부동 C 스타일을 묘사 할 필요가

+1

한 가지 방법은 사용하는 것'새로운 Float32Array ([yourNumber]) [0]'하지만 모든 브라우저에서 지원되지 않는. 왜 잃어버린 정밀도가 필요한가요? – Xufox

+2

"플로트"가 필요한 이유는 무엇입니까? 문맥은 우리가 당신이 가고있는 무슨을 이해할 것을 도울 것이다 – qxz

+0

나는 C 작풍 부동 소수점 숫자를 묘사 할 필요가있다 – marc

답변

4

이 현대 엔진에서 작동합니다 : 결과의 데이터 유형은 수 (배정 밀도)이 여전히

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

이것은 매우 나쁜 정밀도를 제공합니다. – marc

+6

@asehgal 예, 정확히 원했던 것이 아닙니까? – Xufox

+0

나는 나쁜 정밀도를 원하지 않았다. 정확한 손실이 있다고하더라도 32 비트 표현이 바람직하다고 말했습니다. – marc

관련 문제