有关比较的问题 , 请知道的朋友开示: == float f = 66.0f;System.out.println(f==66.0);结果: truefloat f1 = 66.1f;System.out.println(f1==66.1);结果:false为什么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 估计是:因为66.0,66.1默认为double类型.比较的话,66.0忽略了后面的精度66.1会比较后面的精度,float,double后面的长度是不一样的!期待正确答案... Float f = 66.0f; System.out.println(f==66.0); Float f1 = 66.1f; System.out.println(f1==66.1); double d = f; double d1 = f1; System.out.println(d);//结果为66.0 System.out.println(d1);//结果为66.0999984741211 经过测试是这样的.. float f1 = 66.1f; System.out.println(f1==(float)66.1); 这样就是true了 关于浮点数的比较不能这么直接比的只能通过一个区间去比较比如float f = 6.1;要想将f 和 6.1比较大小的话,最好这样 if (((f - 6.1) < 0.001) && ((f - 6.1) > -0.001));即比较他的绝对值。。 谢谢楼上朋友们的回答说的似乎都有道理,能系统的讲点么,知道的朋友------关于浮点数的比较不能这么直接比的 只能通过一个区间去比较比如float f = 6.1; 要想将f 和 6.1比较大小的话,最好这样 if (((f - 6.1) < 0.001) && ((f - 6.1) > -0.001)); 即比较他的绝对值。。--------这个似乎较全面, ----关于浮点数的比较不能这么直接比的 只能通过一个区间去比较比如float f = 6.1; 要想将f 和 6.1比较大小的话,最好这样 if (((f - 6.1) < 0.001) && ((f - 6.1) > -0.001)); 即比较他的绝对值。。 -------- 这个似乎较全面, 但是比较式中的0.001是如何设置的? //---------代码组 1--------- float f = 66.0f; System.out.println(f ==66.0); // true //---------代码组 2--------- float f1 = 66.1f; System.out.println(f1 ==66.1); // false//=================================================//---------代码组 3--------- double f0 = 66.0; System.out.println(f0==66.0); // true //---------代码组 4--------- double f01 = 66.1; System.out.println(f01==66.1); // true 从以上的代码运行结果,个人分析如下:首先要清楚的是: 1. 对于基本类型 ,== 比较的其"值"是否相等 2. java中凡没明确定义类型的小数,其默认类型都是double 对于代码组1,2来说,== 前面是float类型(明确定义的), ==后面是double类型(java自动转化的),二者作 == 比较时,类型不同不能直接比较,java会自动把后者(== 后面的double类型)转化为float类型; 由于double是64位,而float是32位; 转化的过程中可能精度丢失(66.0不会丢失精度,其它的丢失如66.1等),这也是1楼的朋友上级求证的结果 对于代码组3,4,==前面是double类型,等号后面也是double类型,类型匹配,不存在转化丢失精度的问题,==比较时就相等 注: 以上红色字体为个人推测,知道的朋友请确认下 “二者作 == 比较时,类型不同不能直接比较,java会自动把后者(== 后面的double类型)转化为float类型;”这句话,还值得推敲,java会“自动“把float转化为double,不会”自动“把double转为float,可能更好的理解是”“二者作 == 比较时,类型不同不能直接比较,java会自动把“前者"(== 前面的float类型)转化为double类型;在转化的过程中,精度丢失(参见2楼)”,这样更贴切些? float与double做比较,是把 float类型转化为double,但有时会>,<,==等都会有可能。 但有时会>, <,==等都会有可能。 ---何意? 请教,OutOfMemory Error的解决办法。 有一段javascript,是四六级准考证号的...大家谁给解释一下?? java集合类的HashSet怎么用,谁说说 算法问题~~ corejava第八章8.1.3从组件转向事件监听器的例子编译通不过,高手帮忙看一下。 编程语言那种是比较新的啊?有什么特色啊? 有回應就給分!!!! 如何在java中将任意字符转化为数字 迷惑:是学java好还是vc++,c#好?(欢迎大家涌要发言) java中绘制表格问题 在线等知道的大哥们回答!为什么这句话没有执行啊!!!! swt的table不能编辑--急急-----部分代码如下,请高手版忙修改一下
因为66.0,66.1默认为double类型.
比较的话,66.0忽略了后面的精度
66.1会比较后面的精度,float,double后面的长度是不一样的!期待正确答案...
System.out.println(f==66.0);
Float f1 = 66.1f;
System.out.println(f1==66.1);
double d = f;
double d1 = f1;
System.out.println(d);//结果为66.0
System.out.println(d1);//结果为66.0999984741211
经过测试是这样的..
System.out.println(f1==(float)66.1);
这样就是true了
------
关于浮点数的比较不能这么直接比的 只能通过一个区间去比较比如float f = 6.1; 要想将f 和 6.1比较大小的话,最好这样 if (((f - 6.1) < 0.001) && ((f - 6.1) > -0.001)); 即比较他的绝对值。。--------
这个似乎较全面,
关于浮点数的比较不能这么直接比的 只能通过一个区间去比较比如float f = 6.1; 要想将f 和 6.1比较大小的话,最好这样 if (((f - 6.1) < 0.001) && ((f - 6.1) > -0.001)); 即比较他的绝对值。。 --------
这个似乎较全面, 但是比较式中的0.001是如何设置的?
float f = 66.0f;
System.out.println(f ==66.0); // true //---------代码组 2---------
float f1 = 66.1f;
System.out.println(f1 ==66.1); // false//=================================================//---------代码组 3---------
double f0 = 66.0;
System.out.println(f0==66.0); // true //---------代码组 4---------
double f01 = 66.1;
System.out.println(f01==66.1); // true
从以上的代码运行结果,个人分析如下:
首先要清楚的是:
1. 对于基本类型 ,== 比较的其"值"是否相等
2. java中凡没明确定义类型的小数,其默认类型都是double 对于代码组1,2来说,== 前面是float类型(明确定义的), ==后面是double类型(java自动转化的),二者作 == 比较时,类型不同不能直接比较,java会自动把后者(== 后面的double类型)转化为float类型; 由于double是64位,而float是32位; 转化的过程中可能精度丢失(66.0不会丢失精度,其它的丢失如66.1等),这也是1楼的朋友上级求证的结果 对于代码组3,4,==前面是double类型,等号后面也是double类型,类型匹配,不存在转化丢失精度的问题,==比较时就相等
注: 以上红色字体为个人推测,知道的朋友请确认下
---
何意?