登录
首页 >  Golang >  Go问答

如何将十六进制转换为浮点数

来源:Golang技术栈

时间:2023-04-12 15:31:59 427浏览 收藏

大家好,我们又见面了啊~本文《如何将十六进制转换为浮点数》的内容中将会涉及到golang等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我必须转换hex,表示为strings (例如"0xC40C5253")浮点值( IEEE-754 转换)。我没有设法使用 strconv.ParseFloat 函数做到这一点。还有什么我必须使用的吗?到目前为止我找不到它。我也尝试先将其转换为整数,然后再转换为浮点数,但结果是错误的。

我最后一次尝试的代码:

package main

import (
  "fmt"
  "strconv"
)

func main () {
  x, err := strconv.ParseInt("C40C5253", 16, 64) 
  f, err := strconv.ParseFloat(fmt.Sprintf("%d", x), 64) 

  if err != nil {
    fmt.Printf("Error in conversion: %s\n", err)
  } else {
    fmt.Println(f)
  }
}

正确答案

首先需要说明输入的位长。由于十六进制表示有 4 个字节(8 个十六进制数字),它很可能是一个float32(需要询问者的澄清)。

您可以将十六进制表示中的字节解析为uint32using strconv.ParseUint()ParseUint()总是返回uint64在内存中使用 8 个字节,因此您必须将其转换为uint32使用 4 个字节,就像float32

s := "C40C5253"
n, err := strconv.ParseUint(s, 16, 32)
if err != nil {
    panic(err)
}
n2 = uint32(n)

现在您有了字节,但它们存储在类型变量中uint32,因此被解释为整数的字节。你想将它们解释为 IEEE-754 浮点数的字节,你可以使用unsafe包来做到这一点:

f := *(*float32)(unsafe.Pointer(&n2))
fmt.Println(f)

输出(在Go Playground上试试):

-561.2863

笔记:

正如JimB所指出的,对于第二部分(翻译uint32float32mathmath.Float32frombits()

f := math.Float32frombits(n2)

今天关于《如何将十六进制转换为浮点数》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>