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.h
和Decimal128.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/