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 如何用反射reflect操作结构体
Apr 28 Golang
go设置多个GOPATH的方式
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Golang 实现WebSockets
Apr 24 Golang
Go语言入门exec的基本使用
May 20 Golang
Go结合Gin导出Mysql数据到Excel表格
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
用Zend Encode编写开发PHP程序
2006/10/09 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
js闭包实现按秒计数
2015/04/23 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
Python自定义线程池实现方法分析
2018/02/07 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
同居协议书范本
2014/04/23 职场文书
创先争优活动承诺书
2014/08/30 职场文书
学生保证书格式
2015/02/27 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
python非标准时间的转换
2021/07/25 Python
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
通过Python把学姐照片做成拼图游戏
2022/02/15 Python