golang 比较浮点数的大小方式


Posted in Golang onMay 02, 2021

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 相关文章推荐
为什么不建议在go项目中使用init()
Apr 12 Golang
golang中的空slice案例
Apr 27 Golang
彻底理解golang中什么是nil
Apr 29 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Golang的继承模拟实例
Jun 30 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang map映射的用法
Apr 22 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
解决Golang中goroutine执行速度的问题
May 02 #Golang
解决golang结构体tag编译错误的问题
May 02 #Golang
golang 实现Location跳转方式
May 02 #Golang
解决golang post文件时Content-Type出现的问题
May 02 #Golang
对Golang中的FORM相关字段理解
May 02 #Golang
解决go在函数退出后子协程的退出问题
Apr 30 #Golang
Go语言 go程释放操作(退出/销毁)
You might like
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
react-router实现按需加载
2017/05/09 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
python 正则表达式 概述及常用字符
2009/05/04 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
简单谈谈python基本数据类型
2018/09/26 Python
python实现tail -f 功能
2020/01/17 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
设计师个人求职信范文
2014/02/02 职场文书
2014年保卫工作总结
2014/12/05 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
PyTorch的Debug指南
2021/05/07 Python
Go 内联优化让程序员爱不释手
2022/06/21 Golang