Golang 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
而且 Float64 有第二个返回值告诉你结果准确不准确,你直接给忽略掉了…
#2 那个返回值没啥用啊,我要的就是精确的值。。。。
#1 从数据库读取出来的 num1 (用 float 类型接收的)就有问题,不是 2.7 ,是 2.700001
貌似解决了,小数得用 string 来存数据库。。。。
看 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语言中处理浮点数时,主要使用的是float32
和float64
两种类型,其中float64
提供了更高的精度,是更为常用的选择。以下是一些处理浮点数时需要注意的关键点:
-
精度问题:浮点数在计算机中是以二进制形式存储的,这导致某些十进制小数无法被精确表示,从而产生舍入误差。在进行浮点数比较时,应避免直接使用
==
运算符,而是设置一个误差范围来判断两个浮点数是否“足够接近”。 -
格式化输出:使用
fmt
包中的格式化动词(如%.2f
)可以控制浮点数的输出精度,这在日志记录或用户界面显示时非常有用。 -
数学运算:Go的
math
包提供了丰富的数学函数,用于处理浮点数,包括三角函数、对数函数、幂函数等。这些函数都是基于IEEE 754标准实现的,保证了运算的准确性和一致性。 -
类型转换:在将整数转换为浮点数时,通常不会发生问题,但将浮点数转换为整数时,小数部分会被截断,这可能导致意外的结果。因此,在进行类型转换时,应明确其带来的影响。
-
并发安全:浮点数的运算在多线程环境中通常是安全的,但如果在多个goroutine中共享和修改浮点数变量,则需要注意数据竞争的问题,使用
sync
包中的工具来确保并发安全。
总之,处理浮点数时需要谨慎对待其精度和表示问题,以确保程序的正确性和稳定性。