广告
返回顶部
首页 > 资讯 > 后端开发 > GO >解决Golang小数float64在实际工程中加减乘除的精度问题
  • 356
分享到

解决Golang小数float64在实际工程中加减乘除的精度问题

2024-04-02 19:04:59 356人浏览 泡泡鱼
摘要

Go语言的float64类型在做加减乘除时会出现一些问题 比如乘法运算,实例,将小数的元转换成整数的分: 发现将小数的元乘以100后强制转换为整数分,少了1分 解决办法: v

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))
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文档:

--结束END--

本文标题: 解决Golang小数float64在实际工程中加减乘除的精度问题

本文链接: https://www.lsjlt.com/news/122169.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作