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 相关文章推荐
win10下go mod配置方式
Apr 25 Golang
go原生库的中bytes.Buffer用法
Apr 25 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go gorilla/sessions库安装使用
Aug 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
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python线程的两种编程方式
2015/04/14 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Python dict和defaultdict使用实例解析
2020/03/12 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
用 Python 制作地球仪的方法
2020/04/24 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
Python while true实现爬虫定时任务
2020/06/08 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
大学毕业生通用求职信
2013/09/28 职场文书
军训自我鉴定
2014/01/22 职场文书
销售主管岗位职责
2014/02/08 职场文书
融资租赁计划书
2014/04/29 职场文书
2014年村委会工作总结
2014/11/24 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
导游欢送词
2015/01/31 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
keepalived + nginx 实现高可用方案
2022/12/24 Servers
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL