2 c wangbin c_wangbin 于 2016.09.08 14:30 提问

关于 int float double 的 == 比较问题

int i = 6;
float i2 =6.0000f;
float f = 6.0008F;
double d = 6.0008D;
if(i==i2){
System.out.println("Hello");
}
if(f==d){
System.out.println("nihao");
}

    结果:只输出 Hello   不输出 nihao

4个回答

qq_29594393
qq_29594393   Ds   Rxr 2016.09.08 17:36
已采纳

你要去了解一下浮点数在计算机中表示的原理,不然你是理解不了这个东西的,这就是问什么大多数时候都是int 型 ,或者使用整形数组来进行大数的运算
http://blog.csdn.net/iloli/article/details/8447571

c_wangbin
c_wangbin 谢谢
接近 2 年之前 回复
hijack00
hijack00   Rxr 2016.09.08 17:51

浮点数不能使用==进行比较,应该使用abs(x1-x2)<eps判断x1和x2是否相等(其中eps为一个很小的正数,如1e-5)

c_wangbin
c_wangbin 谢谢
接近 2 年之前 回复
bdmh
bdmh   Ds   Rxr 2016.09.08 14:43

浮点数有特殊的存储方式,多数都不能精确表示,所以用 == 判断是否相等就不合适了,你可以把两个数做差,差值小于一定范围视为相等

c_wangbin
c_wangbin 谢谢
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.09.08 14:59

浮点数存在进制转换误差,只有小数是0.5 0.25 0.125 0.0625...以及它们的和(比如0.75=0.5+0.25)等等才能精确表示。
比如
float f = 6.125F;
double d = 6.125D;
这样比较才能相等。
像6.0008,转换为二进制,结果是无限小数,所以double和float当然不等了。

c_wangbin
c_wangbin 谢谢
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
基本数据类型 Int、Double、Float
1.整型 储存整型值的基本类型是 Int. Int 在32位的设备中表现为32位整型,而在64位的设备中则为64位整型。 我们可以通过两个静态属性 min 和 max 来知道其能储存的最小值和最大值: 当需要特定长度的整型时,可以使用 Int8、Int16、 Int32或者Int64. 需要注意的是由于 swift 是一门强类型语言,代码中不能随意混合搭配使用 int 的各种类
int,float,double的边界值
关于limit头文件的所有内容参看c++ reference http://www.cplusplus.com/reference/limits/numeric_limits/?kw=numeric_limits在编程中我们常会遇到扫描求得一个序列的最大值或者最小值的情景,这个时候往往需要给相应的变量附上边界值,确保在任何情况下求得目标值正确。而limits这个头文件是包含了相应的宏定义的,当然如
int, float, double 直接转换
其实学习过编程的同学,都对这三个东西再熟悉不过了。int,又称作整型,在.net中特指的是Int32,为32位长度的有符号整型变量。float,单精度浮点数,32位长度,1位符号位,8位指数位与23位数据位,在.net中又称为Single。double,64位长度的双精度浮点数,1位符号位,11位指数位,52位数据位。它们互相的关系就是:int可以稳式转换成float和double,float只能
int float double BigDecimal
float和double的区别单精度浮点数(float)与双精度浮点数(double)的区别如下:(1)在内存中占有的字节数不同单精度浮点数在机内占4个字节双精度浮点数在机内占8个字节 (2)有效数字位数不同单精度浮点数有效数字8位双精度浮点数有效数字16位 (3)所能表示数的范围不同单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38双精度浮点的表示范围:-1.79E+308 ~ +1
Java double float与int相乘出错问题
看下面的一段代码的运行: public class double_int { public static void main(String[] args) { double d = 0.06; float f = (float) d; int n = 750; int ref = (int) (n * (1 + f)); System.out.println(ref)
int float double 最大值,最小值
http://blog.csdn.net/zxy_snow/article/details/6123551 中没有double的最大最小值。。。   如果输出的比如%.100lf输出2.23432432,没有达到100位,则最后2后面不一定都是0。   原文见http://blog.csdn.net/ACb0y/archive/2010/03/01/5336822
int double float大小范围
int 整型double 双精度浮点float 单精度浮点int 字节4 数值范围:-2147483648~+2147483647float 字节4 数值范围 3.4×10^-38~3.4×10^38(一位小数)double 字节8 数值范围 1.7×10^-308~1.7×10^308(2位小数)
int float double 最值
int float double 最大值,最小值2009-09-18 08:58http://hi.baidu.com/cat_ng/blog/item/1131a4c2af0ea6120ef477db.html1. 显示整型(int)的最小、最大值: #include #include int main(void){int n1,n2;  n1 = I
int, float和double的内存结构
假设为32位机器 int: 符号位为第31位,数值位为第0~30位 float: 符号位为第31位,23~30为指数部分,0~22小数部分 double: 符号位为第63位,52~62为指数部分,0~51小数部分
int、float、double In .Net之相互转换
最近在检查我们公司某台Server时,发现Windows日志中记录了很多SystemToNumber的Crash Exception,问题原因为公司的同事Coding时都犯了一个最基本的原则性错误,鉴于此,觉得还是有必要再梳理下.Net中三个基本的数值类型(int、float、double),。 Int :在.NET中,int是有符号的32位整型数值 ,无论处理器是32位还是64位,它的.N