十进制浮点数与十六进制浮点数互转(nodejs实现)

由于最近要使用十六进制浮点数,网上代码又太杂乱了,自己写了一个

十六进制浮点数转换十进制浮点数

function analyze(data) {
    var str2 = parseInt(data, 16).toString(2)
    while (str2.length < 32) {
        str2 = '0' + str2
    }
    var sign = str2.substring(0, 1)
    var exponent = str2.substring(1, 9)
    var expint = parseInt(exponent, 2)
    var mobit = expint - 127
    var d = Math.pow(2, mobit)
    var last = str2.substring(9)
    var lastRes = 0 // 存放尾数的结果
    for (var i = 0; i < last.length; i++) {
        var b = last[i]
        if (b === '1') {
            lastRes += 1 / Math.pow(2, (i + 1)) // 尾数的计算
        }
    }
    var result = d * (sign === '1' ? -1 : 1) * (1 + lastRes)
    return result;
}

十进制浮点数转换成十六进制浮点数

function toHexFloat(data) {
    var dataArr = data.split('.')
    var header //整数部分
    var footer//小数部分
    header = dataArr[0] !== '0' ? dataArr[0] : 0
    footer = dataArr[1] !== '0' ? dataArr[1] : 0
    if (header == '0' && footer == '0') {
        return '00000000'
    }
    var SS = parseFloat(data) >= 0 ? 0 : 1//S,符号位
    header = Math.abs(header)
    var arr1 = []//二进制整数
    var arr2 = [] //二进制小数
    if (header !== 0) {
        let i = 0, a
        header = parseInt(header)
        while (true) {
            a = header % 2
            arr1[i] = a
            i++
            header = Math.floor(header / 2)
            if (header == 0) {
                break;
            }
        }
    } else {
        arr1[0] = header
    }
    if (footer !== 0) {
        let a, b, j = 0
        while (true) {
            footer = '0.' + footer
            a = (footer * 2).toString()
            b = a.split('.')
            arr2[j] = b[0]
            footer = b[1]
            j++
            if (j >= 10) {
                break;
            }
        }
    } else {
        arr2[0] = 0
    }
    arr1 = arr1.reverse() //整数逆取,小数顺取
    var arr1str = '', arr2str = ''
    arr1.forEach(value => arr1str += value)
    arr2.forEach(value => arr2str += value)
    var obstr
    if (arr1str.length > 1) {
        obstr = arr1str.substr(0, 1) + '.' + arr1str.substr(1, arr1str.length) + arr2str
    } else {
        obstr = arr1str.substr(0, 1) + '.' + arr2str
    }
    console.log(obstr)
    var EE = (arr1str.length - 1) + 127 //E
    EE = EE.toString(2).padStart(8, '0') //8位
    var MM = (obstr.substr(2, obstr.length)).padEnd(23, '0')//M
    var bin = SS + EE + MM
    var endHex = parseInt(bin, 2).toString(16)
    console.log(EE, MM, bin, endHex)
    return endHex
}

默认参数都是字符串,第一个是十六进制浮点数字符串,第二个是十进制浮点数字符串

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值