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项目中使用init()
Apr 12 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Golang的继承模拟实例
Jun 30 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang jwt身份认证
Apr 20 Golang
Golang 实现WebSockets
Apr 24 Golang
Go gorilla securecookie库的安装使用详解
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
玛琪朵 Macchiato
2021/03/03 咖啡文化
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
php中的异常和错误浅析
2017/05/03 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
js匿名函数使用&传参(实例)
2017/09/08 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
幼儿园新学期寄语
2014/01/18 职场文书
更夫岗位责任制
2014/02/11 职场文书
逃课上网检讨书
2014/02/20 职场文书
课例研修方案
2014/05/31 职场文书
意向书范本
2014/07/29 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
学校隐患排查制度
2015/08/05 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技