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 相关文章推荐
golang 实现两个结构体复制字段
Apr 28 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang全局变量加锁的问题解决
May 08 Golang
go xorm框架的使用
May 22 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go语言编译原理之源码调试
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
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python实现媒体播放器功能
2018/02/11 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
python程序如何进行保存
2020/07/03 Python
Python 解析xml文件的示例
2020/09/29 Python
优秀毕业生推荐信
2013/11/02 职场文书
教育实习生的自我评价分享
2013/11/21 职场文书
自我评价范文
2013/12/22 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
员工辞职信范文
2015/03/02 职场文书
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS