简单的说,比较两个int型或long型的数据没有什么问题,可以用==来判断,但对浮点数(float与double)来说,需要对Float.NaN和0.0这个两个特殊数字作额外的处理。
Float.NaN严格说来不是一个数字(它的字面意思也就是Not a Number),但是因为这个值可以被保存在一个float型的变量中(因为它常常是除0的结果),所以暂且当它是个数字吧。但它与一般的浮点数有些许不同,就是两个NaN用==比较的结果会得到false。
可以用下面的代码验证:



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->float nan=Float.NaN;
float anotherNan=Float.NaN;
System.out.println(nan==anotherNan);

输出结果为false

我用另一种除0的方法得到NaN,可以看到使用==判断仍然得到false。代码如下:



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->float overFlow=0.0f/0.0f;
System.out.println(overFlow);
System.out.println(nan==overFlow);

而当我们使用Float.compare()这个方法来比较两个NaN时,却会得到相等的结果。可以用下面的代码验证:



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->System.out.println(Float.compare(nan,anotherNan));
System.out.println(Float.compare(nan,overFlow));

compare()方法如果返回0,就说明两个数相等,返回-1,就说明第一个比第二个小,返回1则正好相反。
上面这两行语句的返回结果都是0。
一般来说,基本类型的compare()方法与直接使用==的效果“应该”是一样的,但在NaN这个问题上不一致,是利是弊,取决于使用的人作何期望。当程序的语义要求两个NaN不应该被认为相等时(例如用NaN来代表两个无穷大,学过高等数学的朋友们都记得,两个无穷看上去符号是一样,但不应该认为是相等的两样东西),就使用==判断;如果NaN被看得无足轻重(毕竟,我只关心数字,两个不是数字的东西就划归同一类好了嘛)就使用Float.compare()。

另一个在==和compare()方法上表现不一致的浮点数就是正0和负0(当然这也是计算机表示有符号数字的老大难问题),我们(万能的)人类当然知道0.0f和-0.0f应该是相等的数字,但是试试下面的代码:



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->float negZero=-0.0f;
float zero=0.0f;
System.out.println(zero==negZero);
System.out.println(Float.compare(zero,negZero));

返回的结果是true和-1。看到了么,==认为正0和负0相等,而compare()方法认为正0比负0要大。所以对0的比较来说,==是更好的选择。

最新文章

  1. MySQL Dll语句
  2. webpack中alias别名配置
  3. Enable MFA for a user
  4. js 把url参数转对象
  5. POJ 2635 The Embarrassed Cryptographer
  6. ASP.NET WebAPI 03 返回结果
  7. [原]Django调试工具--django-debug-toolbar
  8. Android facebook-android-sdk-3.5.2 FQL
  9. golang之匿名函数
  10. [HMLY]12.iOS中的Protocol
  11. NIC Bonding: 2 nic port as 1 interface
  12. poi 合并单元格、设置边框
  13. 在程序加载过程中显示ProgressDialog 对话框
  14. nginx四层负载均衡配置
  15. swift 之 函数
  16. ThreadPoolExcuter源码解析(一)
  17. 《ServerSuperIO Designer IDE使用教程》- 5.树形结构管理设备驱动,小版本更新。发布:v4.2.3.1版本
  18. 第一次c++作业小结
  19. Lucene实现自己的英文空格小写分词器
  20. OPPO A57 刷机(官方安装包)+完美Root+ 破解主题+屏蔽Root顶部红色框+NV修复

热门文章

  1. Http 状态码详解
  2. VPS用LNMP安装WordPress
  3. 【HDU 5184】 Brackets (卡特兰数)
  4. VC模拟发送数据包-百度关键词查找
  5. Android Animation初识
  6. perl post json数据
  7. [LeetCode#277] Find the Celebrity
  8. 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题
  9. JS 利用数组拼接html字符串
  10. Centos6.4 设置开机自动以某个非root用户启动脚本