首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中从双精度到浮点型?

问在JavaScript中从双精度到浮点型?
EN

Stack Overflow用户
提问于 2016-08-05 05:32:02
回答 2查看 1.4K关注 0票数 0

我的理解是,JavaScript中的所有数字都是双精度浮点数。如何在JavaScript中将双精度型转换为浮点型?我理解精确度的损失,但这是可以容忍的。

我需要描述C风格的浮点数

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-05 05:41:22

这将在现代引擎中发挥作用:

代码语言:javascript
复制
function doubleToFloat ( d ) {
    if ( Float32Array )
        return new Float32Array([d])[0];
}

请注意,结果的数据类型仍然是number (双精度),但它仅使用32位信息。我为Float32Array不可用的情况添加了一个后备:

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2019-09-03 00:12:19

另一种方式是:

代码语言:javascript
复制
var doubleValue = Math.random()
var floatValue = ((doubleValue * 1e7) | 0) / 1e7
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38777729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档