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 02 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang jwt身份认证
Apr 20 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 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/04/26 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
js表头排序实现方法
2015/01/16 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
python获取指定时间差的时间实例详解
2017/04/11 Python
python实现简单遗传算法
2018/03/19 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
python查看模块,对象的函数方法
2018/10/16 Python
python模糊图片过滤的方法
2018/12/14 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
如何基于python操作excel并获取内容
2019/12/24 Python
python实现堆排序的实例讲解
2020/02/21 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
python 实现音频叠加的示例
2020/10/29 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
缓刑人员的思想汇报
2014/01/11 职场文书
销售人员求职信
2014/07/22 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
教师节寄语2015
2015/03/23 职场文书
奖励申请报告范文
2015/05/15 职场文书
聘任通知书
2015/09/21 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书