Golang Go语言处理浮点数的疑问

发布于 1周前 作者 caililin 来自 Go语言

由于浮点数和整数直接相乘,有丢失精度的问题,查了查资料用了第三方的库 github.com/shopspring/decimal

num2 := 512  
num1 := 2.7

d, _ := decimal.NewFromFloat(num1).Mul(decimal.NewFromInt(int64(num2))).Float64()
fmt.Printf(“d = %f”, d)

测试计算结果是 1382.400024 ,好像也不是准确的数字啊?

update: 好像从数据库取出来的 num1(float 类型)就不精确,难道要用 string 来存储比较好么。。。。


Golang Go语言处理浮点数的疑问

更多关于Golang Go语言处理浮点数的疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

15 回复

decimal.NewFromFloat(num1).Mul(decimal.NewFromInt(int64(num2))).String() ?这样结果倒是精确的

更多关于Golang Go语言处理浮点数的疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


而且 Float64 有第二个返回值告诉你结果准确不准确,你直接给忽略掉了…

#2 那个返回值没啥用啊,我要的就是精确的值。。。。

#1 从数据库读取出来的 num1 (用 float 类型接收的)就有问题,不是 2.7 ,是 2.700001

貌似解决了,小数得用 string 来存数据库。。。。

数据库不是也有 decimal 么

#6 go 目前官方没有 decimal 类型吧,得依靠第三方的库去转换

https://www.twle.cn/t/90550#reply0 我刚写的,目前最好用的就这个了

用 float64 直接乘也没见有问题

#9 我的例子给的有点问题,num1 输入的值就有问题,实际上不是 2.7 ,而是 2.700001 ,所以造成最后相乘的结果有误差。num1 是从数据库读取的浮点类型,估计是有误差的,目前通用的做法应该是设置成 decimal 类型,至少也得是个 string 类型…

#10 浮点类型用于一般的科学运算没问题,但是要是金融,或者反复运算的场景,误差就比较大了

官方库不是有 big 嘛? math/big/#Float.Mul 。float 数据库存字符串就行。基础类型的 float 只能表示 16 位精度

就你列的那两个数,用基础类型是足以应付的

在Go语言中处理浮点数时,主要使用的是float32float64两种类型,其中float64提供了更高的精度,是更为常用的选择。以下是一些处理浮点数时需要注意的关键点:

  1. 精度问题:浮点数在计算机中是以二进制形式存储的,这导致某些十进制小数无法被精确表示,从而产生舍入误差。在进行浮点数比较时,应避免直接使用==运算符,而是设置一个误差范围来判断两个浮点数是否“足够接近”。

  2. 格式化输出:使用fmt包中的格式化动词(如%.2f)可以控制浮点数的输出精度,这在日志记录或用户界面显示时非常有用。

  3. 数学运算:Go的math包提供了丰富的数学函数,用于处理浮点数,包括三角函数、对数函数、幂函数等。这些函数都是基于IEEE 754标准实现的,保证了运算的准确性和一致性。

  4. 类型转换:在将整数转换为浮点数时,通常不会发生问题,但将浮点数转换为整数时,小数部分会被截断,这可能导致意外的结果。因此,在进行类型转换时,应明确其带来的影响。

  5. 并发安全:浮点数的运算在多线程环境中通常是安全的,但如果在多个goroutine中共享和修改浮点数变量,则需要注意数据竞争的问题,使用sync包中的工具来确保并发安全。

总之,处理浮点数时需要谨慎对待其精度和表示问题,以确保程序的正确性和稳定性。

回到顶部