为了账号安全,请及时绑定邮箱和手机立即绑定

mongodb mongo-go-driver Decimal128 中的高低值是多少以及如何使用

mongodb mongo-go-driver Decimal128 中的高低值是多少以及如何使用

Go
暮色呼如 2022-04-26 20:00:10
MongoDB 的 GO 驱动程序有一个Decimal128类型,它是一个如下所示的结构:type Decimal128 struct {    h, l uint64}根据文档, h 和 l 是 uint64 的高值和低值。这两个值代表什么?假设我想创建一个 Decimal128 ,当转换为字符串时将等于"100.50". 使用下面的函数,h 和 l 的值是多少。func NewDecimal128(h, l uint64) Decimal128 {    return Decimal128{h: h, l: l}} 我总是被迫解析这样的字符串d, _ := primitive.ParseDecimal128("100.50")而不是d := primitive.NewDecimal128(h, l) 创建一个新的 Decimal128 只是因为我不明白如何使用高值和低值来导出十进制值。
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

Decimal128.h两者Decimal128.l都是 type uint64,都有 64 位,加起来是 128 位。


| Decimal128.h bits   || Decimal128.l bits   |

63...            ....0  63...           ....0

Mongo-go 的实现Decimal128类似于/接近IEEE 754 四精度浮点格式,但有一些细微差别。最高位h是符号位,然后有 2 位被忽略,然后是 14 位指数和 111 位有效数。符号位旁边的后续 5 位是特殊的,如果它们的值为0x1f,则表示该Decimal128值表示 NaN(不是数字),如果它们的值为0x1e,则该值表示正无穷或负无穷大(取决于符号位)。


查看该Decimal128.BigInt()方法的实现以获取详细信息。


如您所见,“单个”低值和高值与表示的浮点数没有直接关系,而是按上述方式处理它们的 128 位。


例如,低值和高值"100.50"将是:


d, err := primitive.ParseDecimal128("100.50")

fmt.Println(d, err)

fmt.Printf("%#v", d)

输出(在Go Playground上试试):


100.50 <nil>

primitive.Decimal128{h:0x303c000000000000, l:0x2742}


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 407 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信