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如何去除多余空白字符(含制表符)
Apr 25 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
Go 语言结构实例分析
Jul 04 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang日志包的使用
Apr 20 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 和 HTML
2006/10/09 PHP
第1次亲密接触PHP5(2)
2006/10/09 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
Python面向对象之继承代码详解
2018/01/29 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
python pygame实现五子棋小游戏
2020/10/26 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
《与象共舞》教学反思
2014/02/24 职场文书
数学检讨书1000字
2014/02/24 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
如何用python插入独创性声明
2021/03/31 Python