解決Golang小數(shù)float64在實際工程中加減乘除的精度問題
更新時間:2021年03月22日 14:29:42 作者:muhongzhong
這篇文章主要介紹了解決Golang小數(shù)float64在實際工程中加減乘除的精度問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
GO語言的float64類型在做加減乘除時會出現(xiàn)一些問題
比如乘法運算,實例,將小數(shù)的元轉(zhuǎn)換成整數(shù)的分:
發(fā)現(xiàn)將小數(shù)的元乘以100后強(qiáng)制轉(zhuǎn)換為整數(shù)分,少了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 //發(fā)現(xiàn)將小數(shù)的元乘以100后強(qiáng)制轉(zhuǎn)換為整數(shù)分,少了1分 //解決辦發(fā)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相互轉(zhuǎn)換精度控制
如下所示:
//將float64轉(zhuǎn)成精確的int64 func Wrap(num float64, retain int) int64 { return int64(num * math.Pow10(retain)) } //將int64恢復(fù)成正常的float64 func Unwrap(num int64, retain int) float64 { return float64(num) / math.Pow10(retain) } //精準(zhǔn)float64 func WrapToFloat64(num float64, retain int) float64 { return num * math.Pow10(retain) } //精準(zhǔn)int64 func UnwrapToInt64(num int64, retain int) int64 { return int64(Unwrap(num, retain)) }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開發(fā)
這篇文章主要為大家介紹了GoLang Fiber路由和中間件進(jìn)行高效Web開發(fā),本文將深入探討 Fiber 中的路由細(xì)節(jié),學(xué)習(xí)如何創(chuàng)建和處理路由,深入了解使用路由參數(shù)的動態(tài)路由,并掌握在 Fiber 應(yīng)用程序中實現(xiàn)中間件的藝術(shù)2024-01-01解析go語言調(diào)用約定多返回值實現(xiàn)原理
這篇文章主要為大家介紹了解析go語言調(diào)用約定多返回值實現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Go中string與[]byte高效互轉(zhuǎn)的方法實例
string與[]byte經(jīng)常需要互相轉(zhuǎn)化,普通轉(zhuǎn)化會發(fā)生底層數(shù)據(jù)的復(fù)制,下面這篇文章主要給大家介紹了關(guān)于Go中string與[]byte高效互轉(zhuǎn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09