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语言map与string的相互转换的实现
Apr 07 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Go归并排序算法的实现方法
Apr 06 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang入门之计时器
May 04 Golang
基于Python实现西西成语接龙小助手
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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
js实现验证码功能
2020/07/24 Javascript
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
在Django的上下文中设置变量的方法
2015/07/20 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
用python写测试数据文件过程解析
2019/09/25 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
国外的一些J2EE面试题一
2012/10/13 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
酒店总经理助理岗位职责
2014/02/01 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
统计专业自荐书
2014/07/06 职场文书
保密工作目标责任书
2014/07/28 职场文书
民族精神月活动总结
2014/08/28 职场文书
公务员年终个人总结
2015/02/12 职场文书
旅游项目合作意向书
2015/05/08 职场文书
医院病假条怎么写
2015/08/17 职场文书
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js