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 08 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang slice元素去重操作
Apr 30 Golang
golang elasticsearch Client的使用详解
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang 链表的学习和使用
Apr 19 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内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python连接SQLServer2000的方法详解
2017/04/19 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
Linux机考试题
2015/07/17 面试题
shell变量的作用空间是什么
2013/08/17 面试题
委托公证书
2014/04/08 职场文书
培训讲师岗位职责
2014/04/13 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
详解redis在微服务领域的贡献
2021/10/16 Redis
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技