用mgo输入精确的小数

时间:2014-01-11 17:23:20

标签: go

我正在编写一个应用程序,我用钱并且想要非常准确的数字。我也在使用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)
}

1 个答案:

答案 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应涵盖大多数用例。