go语言浮点数比较相等 golang字符串比较

如何判断两个浮点数(float类型)是否相等

方法1: 比较 f1,f2; 不相等 返回0,相等 返回 1:

创新互联主营向阳网站建设的网络公司,主营网站建设方案,app软件开发,向阳h5重庆小程序开发公司搭建,向阳网站营销推广欢迎向阳等地区企业咨询

int comp_eq (float f1, float f2){

if ( (f1f2) || (f2 f1) ) return 0; else return ;

}

方法2: f1,f2 之差的绝对值 小于 EPS, 认为2者相等。

#include math.h

float f1,f2,EPS = 1E-06;

int comp_eq2 (float f1, float f2, float EPS){

if ( fabs(f1,f2) EPS) return 1; else return 0;

}

golang比较浮点数是否相等

由于小数二进制和十进制转换的时候,会有精度丢失的问题,所以我们在比较浮点数是否相等,指的是在一定精度范围内的两个浮点数是否相等。

参看了网上其他人的实现

实现1 , 实现2

基本上都一样,于是我就改了几个值验证了一下,

结果发下

那么这个程序一定是有什么地方没有考虑到。

这是一个逻辑很简单的程序,不知道当初写这个程序的人为什么要使用math.Dim,看起来高大上,百度了一下,前两条给的说明是: 含义“复数的维度”。老实说没有看懂。按照浮点数的原理,这里equal功能只是,比较一下大小,两者相差(不关心正负,需要取绝对值),小于可以接受的精度,即可认为相等

这样输出的结果就对了,顺便也测试了精度小于0.000001的两个数直接判断相等了。

那么原来的程序错在什么地方呢?

查看看一下math.Dim的文档," Dim() function provided by the math package return the maximum of a-b or 0. "

也就是这个函数比较第一个参数和第二个参数的差值,然后和0比较大小。我们这里需要精度是两个参数的差的绝对值,不关注正负。

这样运算结果就对了。但是这样多引入了math包,实际程序也没有变得简单。所以写程序还是应该追求简单实用,不要为了高大上而复杂。

浮点数如何比较是否相等

由于浮点数伴随着无法精确表示而进行近似或舍入,处理器是32位还是64位都会导致浮点数值不一样,所以浮点数不能够使用 == 来判断两个浮点数是否相等。

浮点数比较应该通过fabs方法算出两个浮点数间的绝对值,再判断是否在设定的精确度范围内,如果在,则表示相等,否则不相等。

如:

if(fabs(a-b) 精确度){

}

精确度可以自己设定,设:0.0001;也可以使用oc中的宏(FLT_EPSILON)

备注:

1、FLT_EPSILON用于float类型。它是满足 x+1.0不等于1.0的最小的正数。

2、DBL_EPSILON用于double类型。

3、abs 方法用于整型间的绝对值。


名称栏目:go语言浮点数比较相等 golang字符串比较
文章起源:http://ybzwz.com/article/ddpodih.html