我正在编写一个应用程序,我用钱并且想要非常准确的数字。我也在使用mgo来存储一些应用程序后的结果。我想知道我是否有办法在结构中使用math.Rat
或godec并将其存储为mgo中的数字?
这是我希望运行的代码:
package main
import(
"fmt"
"math/big"
"labix.org/v2/mgo"
)
var mgoSession *mgo.Session
type Test struct{
Budget big.Rat
}
func MongoLog(table string, pointer interface{}) {
err := mgoSession.DB("db_log").C(table).Insert(pointer)
if err != nil {
panic(err)
}
}
func main(){
var err error
mgoSession, err = mgo.Dial("localhost:27017")
defer mgoSession.Close()
if err != nil {
panic(err)
}
cmp := big.NewRat(1, 100000)
var test = Test{Budget : *big.NewRat(5, 10)}
MongoLog("test", &test)
for i := 0; i < 20; i++{
fmt.Printf("Printf: %s\n", test.Budget.FloatString(10))
fmt.Println("Println:", test.Budget, "\n")
test.Budget.Sub(&test.Budget, cmp)
// test.Budget = test.Budget - cpm
}
MongoLog("test", &test)
}
答案 0 :(得分:3)
big.Rat
基本上是一对未说明的 int
big.Int
值,分别描述有理数的分子和分母。
您可以通过(*big.Rat).Denom
和(*big.Rat).Num
轻松获取这两个号码。
然后将它们存储在您自己的结构中,并使用导出的(大写)字段:
type CurrencyValue struct {
Denom int64
Num int64
}
将此商店与mgo
一起存储,然后通过*big.Rat
big.NewRat
修改强>
Nick Craig-Wood在评论中正确地指出big.Rat
实际上包含2个big.Int
值,而不是我写过的int
值(很容易错过大写字母i)。在BSON中代表big.Int
很难,但int64
应涵盖大多数用例。