浮點數(shù)儲存至內(nèi)存中時,2的-1、-2……-n次方不能精確的表示小數(shù)部分,所以再把這個數(shù)從地址中取出來進行計算就出現(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ù)
func Decimal(value float32) string { value1 := fmt.Sprintf("%.6f", value) return value1 }
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)的表示方式問題導致有一部分數(shù)據(jù)會出現(xiàn)問題,
var v = 67.6 fmt.Println(int64(v *100)) 輸出結(jié)果為:6759
使用"github.com/shopspring/decimal"包,將對浮點數(shù)進行精確計算,例如:
f1 := decimal.NewFromFloat(v) f2 := decimal.NewFromFloat(100) fmt.Println(f1.Mul(f2).IntPart()) 輸出結(jié)果為6760
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。