The GO driver for MongoDB具有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只是因为我不了解如何使用高值和低值来导出十进制值。

最佳答案

Decimal128.hDecimal128.l均为uint64类型,都具有64位,总共为128位。

| Decimal128.h bits   || Decimal128.l bits   |
63...            ....0  63...           ....0

Mongo-go的Decimal128的实现与IEEE 754 quadruple-precision floating-point format类似/接近,但有一些细微的差异。 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}

关于mongodb - mongodb mongo-go-driver Decimal128中的高值和低值是什么,以及如何使用它们创建新的十进制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59562936/

10-16 20:54