解决Golang小数float64在实际工程中加减乘除的精度问题
更新时间:2021年03月22日 14:29:42 作者:muhongzhong
这篇文章主要介绍了解决Golang小数float64在实际工程中加减乘除的精度问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
GO语言的float64类型在做加减乘除时会出现一些问题
比如乘法运算,实例,将小数的元转换成整数的分:
发现将小数的元乘以100后强制转换为整数分,少了1分
解决办法:
var ( a, b float64 c int64 ) a = 2.55 b = 0.0
c = int64((a + b) * 100.0) fmt.Printf("第1次 c=%d\n", c) //第1次 c=254 c = int64(a * 100.0) fmt.Printf("第2次 c=%d\n", c) //第2次 c=254 fmt.Println(a * 100) //254.99999999999997 //发现将小数的元乘以100后强制转换为整数分,少了1分 //解决办发1: tmpStr1 := fmt.Sprintf("%.2f", a) tmpStr2 := fmt.Sprintf("%.2f", b) tmpnum1, _ := strconv.ParseInt(strings.Replace(tmpStr1, ".", "", 1), 10, 64) tmpnum2, _ := strconv.ParseInt(strings.Replace(tmpStr2, ".", "", 1), 10, 64) c = tmpnum1 + tmpnum2 fmt.Printf("第3次 c=%d\n", c) //第3次 c=255
//方法2:
num3 := math.Ceil(a * 100.0) fmt.Printf(“num3=%d\n”, int64(num3)) //num3=255 //方法3: strFloat := strconv.FormatFloat(a*100, ‘f', 0, 64) nInt64, err := strconv.ParseInt(strFloat, 10, 64)
补充:golang float64,in64相互转换精度控制
如下所示:
//将float64转成精确的int64 func Wrap(num float64, retain int) int64 { return int64(num * math.Pow10(retain)) } //将int64恢复成正常的float64 func Unwrap(num int64, retain int) float64 { return float64(num) / math.Pow10(retain) } //精准float64 func WrapToFloat64(num float64, retain int) float64 { return num * math.Pow10(retain) } //精准int64 func UnwrapToInt64(num int64, retain int) int64 { return int64(Unwrap(num, retain)) }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
相关文章
掌握GoLang Fiber路由和中间件技术进行高效Web开发
这篇文章主要为大家介绍了GoLang Fiber路由和中间件进行高效Web开发,本文将深入探讨 Fiber 中的路由细节,学习如何创建和处理路由,深入了解使用路由参数的动态路由,并掌握在 Fiber 应用程序中实现中间件的艺术2024-01-01
最新评论