golang 处理十进制浮点数

刚刚学习使用golang,在用gorm时,发现没有数据类型对应十进制浮点数!大家都没有遇到这样的问题么?

阅读 7.3k
3 个回答

用浮点数计算就有这个问题,如果需要精确计算的话,可以考虑使用这个库:decimal.

不使用第三方库的话,也可以考虑使用整形。比如在价格计算里,可以用100代表1分。这样也可以避免浮点数的问题。

关于浮点数运算不准确的原因,可以阅读下这个:http://floating-point-gui.de/

都没有遇到这样的问题么?二进制浮点和十进制浮点还是有不同的,postgresql数据库中有numeric类型可以处理十进制浮点的数据运算。难道没有人遇到这样的问题?

好长时间没用回答,让我非常奇怪!为了说明问题,举个栗子:

package main

import "fmt"

func main() {
    var n float64 = 0
    for i := 0; i < 1000; i++ {
        n += .01
    }
    fmt.Println(n)
}

我们希望(十进制的理解)结果是10。但是实际的情况是:9.999999999999831 !这个保存到数据库就不对了!请大家不吝赐教,在go语言中如何处理十进制浮点数的计算!go语言没有这样的库?

新手上路,请多包涵

使用了IEEE 754浮点数格式来存储浮点类型(float 32,double 64)的编程语言都会出现这种问题~
简而言之,0.1用二进制就不能在使用二进制内精确的使用这样的方式表达,只能无限接近.并且浮点数可表达的范围也是很小的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题