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 26 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
go设置多个GOPATH的方式
May 05 Golang
Golang二维数组的使用方式
May 28 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
Go 语言结构实例分析
Jul 04 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang 实现WebSockets
Apr 24 Golang
深入理解 Golang 的字符串
May 04 Golang
GO中sync包自由控制并发示例详解
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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
实例讲解PHP表单
2020/06/10 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
拖动时防止选中
2017/02/03 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
详解小程序云开发数据库
2019/05/20 Javascript
Python闭包和装饰器用法实例详解
2019/05/22 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
python处理excel绘制雷达图
2019/10/18 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
网站域名和主机:Domain.com
2019/04/01 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
为什么group by 和order by会使查询变慢
2014/05/16 面试题
校园活动策划书范文
2014/01/10 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
禁毒宣传标语
2014/06/19 职场文书
2014年预算员工作总结
2014/12/05 职场文书
升学宴家长致辞
2015/07/27 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书