使用 mgo 进行精确的小数计算

标签 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)
}

最佳答案

big.Rat 基本上是一对未导出的 int big.Int 值,描述分子和分母分别是有理数。

您可以通过(*big.Rat).Denom(*big.Rat).Num 轻松获得这两个数字。

然后将它们存储在您自己的结构中,并导出(大写)字段:

type CurrencyValue struct {
    Denom int64
    Num   int64
}

使用 mgo 存储它并通过 big.NewRat 在您的应用程序中将其转换回 *big.Rat

编辑:

Nick Craig-Wood 在评论中正确地指出 big.Rat 实际上包含 2 个 big.Int 值,而不是 int 值我已经写了(很容易漏掉大写的 i)。在 BSON 中很难表示 big.Int,但是 int64 应该涵盖大多数用例。

关于使用 mgo 进行精确的小数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21065415/

相关文章:

戈朗 : verify x509 certificate was signed using private key that corresponds to the specified public key

go - go中修改 map 的约定

datetime - 将 Go 时间从 UnixDate 转换为 RFC3339 无法保留时区

arrays - Go:空花括号对数组初始化内存分配的影响

interface - 如何获取未知接口(interface)上的结构值{}

casting - 在 Go 中将 int 转换为 rune

google-app-engine - 如何在数据存储中定义键类型?

go - 整数溢出 - golang

go - MapScan 无法解码为非指针 int64

http - 在 http.Handler ServeHTTP 函数中计算 Go 中发送和接收的字节数?