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各时间字符串使用解析
Apr 02 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
go语言中fallthrough的用法说明
May 06 Golang
Go timer如何调度
Jun 09 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 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
解决GD中文乱码问题
2007/02/14 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
PHP实现图片压缩
2020/09/09 PHP
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
详解vue中axios的封装
2018/07/18 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
python 二分查找和快速排序实例详解
2017/10/13 Python
python psutil库安装教程
2018/03/19 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
Django通过json格式收集主机信息
2020/05/29 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
党员入党表决心的话
2014/03/11 职场文书
元旦晚会主持词
2014/03/24 职场文书
2014年三万活动总结
2014/04/26 职场文书
元旦晚会活动总结
2014/07/09 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
党委领导班子整改方案
2014/09/30 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书