golang 比較浮點數(shù)的大小方式
Golang浮點數(shù)比較和運算會出現(xiàn)誤差。
浮點數(shù)儲存至內(nèi)存中時,2的-1、-2……-n次方不能精確的表示小數(shù)部分,所以再把這個數(shù)從地址中取出來進(jìn)行計算就出現(xiàn)了偏差。
package main
import (
"errors"
"fmt"
"github.com/shopspring/decimal"
)
func FloatCompare(f1, f2 interface{}) (n int, err error) {
var f1Dec, f2Dec decimal.Decimal
switch f1.(type) {
case float64:
f1Dec = decimal.NewFromFloat(f1.(float64))
switch f2.(type) {
case float64:
f2Dec = decimal.NewFromFloat(f2.(float64))
case string:
f2Dec, err = decimal.NewFromString(f2.(string))
if err != nil {
return 2, err
}
default:
return 2, errors.New("FloatCompare() expecting to receive float64 or string")
}
case string:
f1Dec, err = decimal.NewFromString(f1.(string))
if err != nil {
return 2, err
}
switch f2.(type) {
case float64:
f2Dec = decimal.NewFromFloat(f2.(float64))
case string:
f2Dec, err = decimal.NewFromString(f2.(string))
if err != nil {
return 2, err
}
default:
return 2, errors.New("FloatCompare() expecting to receive float64 or string")
}
default:
return 2, errors.New("FloatCompare() expecting to receive float64 or string")
}
return f1Dec.Cmp(f2Dec), nil
}
func main() {
a:=4.0
b:="4"
fmt.Println(FloatCompare(a,b))
}
補充:golang 判斷2個浮點型數(shù)字是否相同
判斷2個浮點型數(shù)字是否相同的方法(假定整數(shù)部分+小數(shù)點后3位相同,則視為相同)
首先將2個浮點型數(shù)字轉(zhuǎn)換為string數(shù)據(jù)
將float類型的數(shù)據(jù)轉(zhuǎn)換成string
func Decimal(value float32) string {
value1 := fmt.Sprintf("%.6f", value)
return value1
}
比較兩個由float型數(shù)據(jù)轉(zhuǎn)化成string的數(shù)據(jù)是否相同是否相同
func Compare(val1,val2 string) bool {
indexf :=strings.Index(val1,".") + 4
indexs :=strings.Index(val2,".") + 4
if indexs != indexf {
return false
}else {
if val1[0:indexf] == val2[0:indexs]{
return true
}else {
return false
}
}
}
補充:golang 浮點數(shù)操作
數(shù)據(jù)庫中金額元存儲的數(shù)據(jù)結(jié)構(gòu)使用的是decimal(15,2),golang中使用float64保存變量內(nèi)容。通過轉(zhuǎn)換將 float64 -> int64
最簡單的方式:int64(float64 * 100),但是由于浮點數(shù)在計算機內(nèi)的表示方式問題導(dǎo)致有一部分?jǐn)?shù)據(jù)會出現(xiàn)問題,
例如:
var v = 67.6 fmt.Println(int64(v *100)) 輸出結(jié)果為:6759
解決方法:
使用"github.com/shopspring/decimal"包,將對浮點數(shù)進(jìn)行精確計算,例如:
f1 := decimal.NewFromFloat(v) f2 := decimal.NewFromFloat(100) fmt.Println(f1.Mul(f2).IntPart()) 輸出結(jié)果為6760
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
go?goquery網(wǎng)頁解析實現(xiàn)示例
這篇文章主要為大家介紹了go?goquery網(wǎng)頁解析實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
golang+vue打造高效多語言博客系統(tǒng)的完整指南
這篇文章主要為大家詳細(xì)介紹了如何使用golang和vue打造一個高效多語言博客系統(tǒng),本文為大家附上了完整版指南,有需要的小伙伴可以參考一下2025-03-03
詳解Go如何基于現(xiàn)有的context創(chuàng)建新的context
在?Golang?中,context?包提供了創(chuàng)建和管理上下文的功能,那么在GO語言中如何基于現(xiàn)有的context創(chuàng)建新的context,下面小編就來和大家詳細(xì)聊聊2024-01-01
Go語言生成UUID的利器(github.com/google/uuid)
UUID是確保每個元素唯一性的重要工具,Go語言雖然在標(biāo)準(zhǔn)庫中沒有直接提供UUID生成功能,但可以通過安裝github.com/google/uuid庫來實現(xiàn),本文就來介紹一下,感興趣的可以了解一下2024-11-11

