golang 比较浮点数的大小方式
作者:爱了李召君 发布时间:2024-04-28 10:48:50
标签:golang,浮点数,大小
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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/qq_21821091/article/details/103683618


猜你喜欢
- EcmaScript正則表達式( 深入淺出系列之淺出 ^_^ )在线正则表达式测试:http://www.aspxhome.com/RegE
- ini文件是windows中经常使用的配置文件,主要的格式为:[Section1]option1 : value1option2 : val
- 我们知道,TCP是面向连接流传输的,其采用Nagle算法,在缓冲区对上层数据进行了处理。避免触发自动分片机制和网络上大量小数据包的同时也造成
- 计数器(Counter)是一个非常常用的功能组件,这篇blog以未读消息数为例,介绍了在 Django中实现一个高性能计数器的基本要点。故事
- 本文仅作为基本操作流程的记录,不进行细节描述一、环境安装1、安装Pycharm在官网上下载最新版本Pycharm安装即可2、安装pyQT5p
- 代码如下:<html> <head> &nb
- ETL的考虑 做 数据仓库系统,ETL是关键的一环。说大了,ETL是数据整合解决
- 本文为大家分享了Mysql WorkBench安装配置图文教程,供大家参考,具体内容如下workbench下载地址下载到workbench下
- 主键索引排序失效环境:MySQL8有一张用户信息表user_info,建表DDL如下:CREATE TABLE `user_info` (
- 本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下1 Virginia加密算法、解密算法Vigenenre
- information_schema数据库是在mysql的版本5.0之后产生的,一个虚拟数据库,物理上并不存在。information_sc
- 看到Django和layim实现websocketde资料很少,自己就琢磨了下,顺便搭建出来了。自己要去找闲心大神授权呀。先来看图这是初次搭
- 1.思路在网上查找了半天,基本都是提取word中文字的,没有找到可以把word中的图片提取出来的方法。一个巧合的情况下,发现将word的后缀
- 来自某个nb招聘的题目:请给Array本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重
- 基本映射映射使用在根据不同URLs请求来产生相对应的返回内容.Bottle使用route() 修饰器来实现映射.from bottle im
- 本文实例讲述了Python Django框架单元测试之文件上传测试。分享给大家供大家参考,具体如下:Submitting files is
- 本文研究的主要是Python subprocess模块的相关内容,具体如下。在学习这个模块前,我们先用Python的help()函数查看一下
- 本人非计算机,亦非心理学,或者交互设计,更非设计专业出身,因此什么都是半桶水。即使如此,依然靠着兴趣寻找乐趣。对于设计,爱之,但没有受过系统
- 前言:目前在研究易信公众号,想给公众号增加一个获取个人交通违章的查询菜单,通过点击返回查询数据。以下是实施过程。一、首先,用火狐浏览器打开X
- 本文实例讲述了Python自定义函数实现求两个数最大公约数、最小公倍数。分享给大家供大家参考,具体如下:1. 求最小公倍数的算法:最小公倍数