濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > golang 比較浮點(diǎn)數(shù)的大小方式

golang 比較浮點(diǎn)數(shù)的大小方式

熱門標(biāo)簽:外呼系統(tǒng)用什么卡 電話機(jī)器人軟件免費(fèi) 百度地圖標(biāo)注后傳給手機(jī) 外呼系統(tǒng)顯本地手機(jī)號(hào) 壽光微信地圖標(biāo)注 excel地圖標(biāo)注分布數(shù)據(jù) 涿州代理外呼系統(tǒng) 阿克蘇地圖標(biāo)注 評(píng)價(jià)高的400電話辦理

Golang浮點(diǎn)數(shù)比較和運(yùn)算會(huì)出現(xiàn)誤差。

浮點(diǎn)數(shù)儲(chǔ)存至內(nèi)存中時(shí),2的-1、-2……-n次方不能精確的表示小數(shù)部分,所以再把這個(gè)數(shù)從地址中取出來(lái)進(jìn)行計(jì)算就出現(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))
}

補(bǔ)充:golang 判斷2個(gè)浮點(diǎn)型數(shù)字是否相同

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

首先將2個(gè)浮點(diǎn)型數(shù)字轉(zhuǎn)換為string數(shù)據(jù)

將float類型的數(shù)據(jù)轉(zhuǎn)換成string

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

比較兩個(gè)由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
      }
   }
}

補(bǔ)充:golang 浮點(diǎn)數(shù)操作

數(shù)據(jù)庫(kù)中金額元存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)使用的是decimal(15,2),golang中使用float64保存變量?jī)?nèi)容。通過(guò)轉(zhuǎn)換將 float64 -> int64

最簡(jiǎn)單的方式:int64(float64 * 100),但是由于浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)的表示方式問(wèn)題導(dǎo)致有一部分?jǐn)?shù)據(jù)會(huì)出現(xiàn)問(wèn)題,

例如:

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

解決方法:

使用"github.com/shopspring/decimal"包,將對(duì)浮點(diǎn)數(shù)進(jìn)行精確計(jì)算,例如:

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang實(shí)現(xiàn)對(duì)docker容器心跳監(jiān)控功能
  • 淺談golang 中time.After釋放的問(wèn)題
  • golang 定時(shí)任務(wù)方面time.Sleep和time.Tick的優(yōu)劣對(duì)比分析
  • golang日志包logger的用法詳解
  • golang elasticsearch Client的使用詳解
  • Golang的func參數(shù)及返回值操作
  • golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能
  • Golang: 內(nèi)建容器的用法

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang 比較浮點(diǎn)數(shù)的大小方式》,本文關(guān)鍵詞  golang,比較,浮,點(diǎn)數(shù),的,大小,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang 比較浮點(diǎn)數(shù)的大小方式》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang 比較浮點(diǎn)數(shù)的大小方式的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    洞头县| 无为县| 扎兰屯市| 丹江口市| 田东县| 仪征市| 吕梁市| 浑源县| 隆回县| 通榆县| 军事| 墨竹工卡县| 包头市| 蕉岭县| 天柱县| 亳州市| 靖西县| 西青区| 潜山县| 县级市| 嘉义县| 和顺县| 津南区| 石林| 密山市| 内乡县| 永定县| 诸城市| 嵊泗县| 从江县| 永安市| 仙游县| 邳州市| 泾源县| 城口县| 从江县| 阿巴嘎旗| 砚山县| 红河县| 同德县| 绥宁县|