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中切片copy复制和等号复制的区别介绍
Apr 27 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang解析JSON对象
Apr 30 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 错误处理机制
2015/07/06 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
Javascript var变量隐式声明方法
2009/10/19 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
python super的使用方法及实例详解
2019/09/25 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
django实现后台显示媒体文件
2020/04/07 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
详解Python流程控制语句
2020/10/28 Python
python 图像增强算法实现详解
2021/01/24 Python
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
家长会学生演讲稿
2014/04/26 职场文书
上海世博会口号
2014/06/19 职场文书
应聘护士求职信
2014/07/21 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
学校运动会报道稿
2014/09/23 职场文书
辅导员学期工作总结
2015/08/14 职场文书
python实现简单区块链结构
2021/04/25 Python