刚刚学习使用golang,在用gorm时,发现没有数据类型对应十进制浮点数!大家都没有遇到这样的问题么?
都没有遇到这样的问题么?二进制浮点和十进制浮点还是有不同的,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用二进制就不能在使用二进制内精确的使用这样的方式表达,只能无限接近.并且浮点数可表达的范围也是很小的
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答890 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.1k 阅读
用浮点数计算就有这个问题,如果需要精确计算的话,可以考虑使用这个库:decimal.
不使用第三方库的话,也可以考虑使用整形。比如在价格计算里,可以用100代表1分。这样也可以避免浮点数的问题。
关于浮点数运算不准确的原因,可以阅读下这个:http://floating-point-gui.de/