校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > golang 比較浮點數的大小方式

golang 比較浮點數的大小方式

熱門標簽:外呼系統用什么卡 電話機器人軟件免費 百度地圖標注后傳給手機 外呼系統顯本地手機號 壽光微信地圖標注 excel地圖標注分布數據 涿州代理外呼系統 阿克蘇地圖標注 評價高的400電話辦理

Golang浮點數比較和運算會出現誤差。

浮點數儲存至內存中時,2的-1、-2……-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個浮點型數字是否相同

判斷2個浮點型數字是否相同的方法(假定整數部分+小數點后3位相同,則視為相同)

首先將2個浮點型數字轉換為string數據

將float類型的數據轉換成string

func Decimal(value float32) string {
   value1 := fmt.Sprintf("%.6f", value)
   return value1
}

比較兩個由float型數據轉化成string的數據是否相同是否相同

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 浮點數操作

數據庫中金額元存儲的數據結構使用的是decimal(15,2),golang中使用float64保存變量內容。通過轉換將 float64 -> int64

最簡單的方式:int64(float64 * 100),但是由于浮點數在計算機內的表示方式問題導致有一部分數據會出現問題,

例如:

var v = 67.6  
fmt.Println(int64(v *100)) 輸出結果為:6759
 

解決方法:

使用"github.com/shopspring/decimal"包,將對浮點數進行精確計算,例如:

f1 := decimal.NewFromFloat(v)
f2 := decimal.NewFromFloat(100)
fmt.Println(f1.Mul(f2).IntPart()) 輸出結果為6760

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang實現對docker容器心跳監控功能
  • 淺談golang 中time.After釋放的問題
  • golang 定時任務方面time.Sleep和time.Tick的優劣對比分析
  • golang日志包logger的用法詳解
  • golang elasticsearch Client的使用詳解
  • Golang的func參數及返回值操作
  • golang協程池模擬實現群發郵件功能
  • Golang: 內建容器的用法

標簽:欽州 蘭州 汕頭 雞西 重慶 吐魯番 梅河口 銅川

巨人網絡通訊聲明:本文標題《golang 比較浮點數的大小方式》,本文關鍵詞  golang,比較,浮,點數,的,大小,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang 比較浮點數的大小方式》相關的同類信息!
  • 本頁收集關于golang 比較浮點數的大小方式的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 武安市| 大同市| 惠州市| 渝北区| 永城市| 井冈山市| 石楼县| 虹口区| 曲阜市| 达州市| 丰宁| 尼玛县| 辽源市| 历史| 乌什县| 宝兴县| 浪卡子县| 遂平县| 朝阳市| 孝昌县| 墨竹工卡县| 武鸣县| 醴陵市| 凤凰县| 百色市| 紫金县| 稻城县| 溧阳市| 江北区| 福建省| 绥阳县| 泰和县| 南丹县| 葫芦岛市| 石家庄市| 区。| 昌都县| 龙里县| 泉州市| 类乌齐县| 含山县|