今天被老师问到1/0 , 1.0/0 , 1/0.0 , 1.0/0.0

原来之前还是没有掌握的细节问题啊~~~~  好好的啃一下。。。。。。。!!!!!!!!!!!!!!!!!!!!!

1、i == i + 1?

一个数字永远不会等于它自己加1?Java 强制要求使用IEEE 754 浮点数算术运算[IEEE 754],它可以让你用一个double 或float来表示无穷大。正如我们在学校里面学到的,无穷大加1还是无穷大。

你可以用任何被计算为无穷大的浮点算术表达式来初始化i,例如:

double i = 1.0 / 0.0;

不过,你最好是能够利用标准类库为你提供的常量:

double i = Double.POSITIVE_INFINITY;

事实上,你不必将i 初始化为无穷大以确保循环永远执行。任何足够大的浮点数都可以实现这一目的,例如:

double i = 1.0e40;

2、i != i?

一个数字总是等于它自己? IEEE 754 浮点算术保留了一个特殊的值用来表示一个不是数字的数量[IEEE 754]。这个值就是NaN(“不是一个数字(Not a Number)”的缩写),对于所有没有良好的数字定义的浮点计算,例如0.0/0.0,其值都是它。规范中描述道,NaN 不等于任何浮点数值,包括它自身在内[JLS ]。

你可以用任何计算结果为NaN 的浮点算术表达式来初始化i,例如:

double i = 0.0 / 0.0;

同样,为了表达清晰,你可以使用标准类库提供的常量:

double i = Double.NaN;

NaN 还有其他的惊人之处。任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。这条规则是非常合理的,但是它却具有奇怪的结果。例如,下面的程序将打印false:

class Test {

public static void main(String[] args) {

double i = 0.0 / 0.0;

System.out.println(i - i == 0);

}

}

总之,float 和double 类型都有一个特殊的NaN 值,用来表示不是数字的数量。

3、NaN与任何数比较均返回false

if( (0 > c) || (0 == c) || (0 < c)){

System.out.println("NaN compared with 0 is not always false.");

}else{

System.out.println("NaN compared with 0 is always false!");

}

注:

Double.NaN == Double.NaN,结果是false。但是,

Double a = new Double(Double.NaN);

Double b = new Double(Double.NaN);]

a.equals(b);  //true

4、Float.compare()

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

float nan=Float.NaN;

float anotherNan=Float.NaN;

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

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

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的比较来说,==是更好的选择。

更有趣的事:

double i = 1.0 / 0;

System.out.println(i); //Infinity

System.out.println(i + 1); //Infinity

System.out.println(i == i + 1); //true

i = 0.0 / 0;

System.out.println(i); //NaN

System.out.println(i + 1); //NaN

System.out.println(i == i + 1); //false

java i= i_java中 i!=i+1?你错了。 | 学步园相关推荐

  1. java角度_java中角度或弧度的计算 | 学步园

    math中调用tan()的反三角函数. 应该表达为 (角度/180度)* π(3.14)= Math.atan((dpPoint.y-dpCenter.y) / (dpPoint.x-dpCenter ...

  2. java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园

    定时器的应用 1.  定时器主要涉及到两个类(java.util包中) @->public class Timer extendsObject (一种工具,线程用其安排以后在后台线程中执行的任务 ...

  3. java调用存储过程sqlserver_Java调用SqlServer存储过程怎么实现 | 学步园

    在使用Java开发时,经常会遇到调用SqlServer存储过程的问题.下面学步园小编来讲解下Java调用SqlServer存储过程怎么实现? Java调用SqlServer存储过程怎么实现 1.数据库 ...

  4. mysql 枚举字段,MySQL字段中的枚举是什么意思 | 学步园

    MySQL字段相信大家都有一些了解,为您介绍的是MySQL字段中的枚举,希望对您学习MySQL字段方面能够有所帮助.下面学步园小编来讲解下MySQL字段中的枚举是什么意思? MySQL字段中的枚举是什 ...

  5. java 负数存储结构_负数在java中的存储和读取过程 | 学步园

    问题描述: 将-5存储在文本文件中,再读取出来显示到控制台; 预备知识: 1.在java中使用补码处理数字,而且byte(8)的数字在扩展成int(32)类型的时候,正数填充0,负数填充1; 2.负数 ...

  6. java调c++代码_Java中调用C++代码的实现 | 学步园

    JNI为  Java Native Interface 即Java本地接口,使用此种方式可以对C/C++代码进行调用,其在本质上是对C/C++生成的动态库进行调用而不是直接对C/C++代码进行调用 J ...

  7. java同时关闭两个窗口_在一个窗口中同时关闭多个窗口的问题(Swing中事件多点传送的问题) | 学步园...

    class   A{} A中包含有: JFrame   frameA; JButton   btnA; class   B{} B中包含有: final   JFrame   frameB; Stat ...

  8. java 点到点最短路径,迪杰斯特拉算法处理无向图中最短路径的(dijkstra)Java实现(指定两点,求最短距离及路径) | 学步园...

    其实不是原创哈,我写不出来. 如何求图中V0到V5的最短路径呢? java实现的方式如下: 第一步,根据图来建立权值矩阵: int[][] W = { {  0,   1,   4,  -1,  -1 ...

  9. java biginteger使用_java中的BigInteger的基本用法 | 学步园

    注 : 为了更好的理解BigInteger类,特提供了一篇关于BigInteger的题目及本人的解答,感兴趣的朋友可以到我的博客看一下 import java.math.BigInteger; pub ...

最新文章

  1. Python初学者请注意!别这样直接运行python命令,否则电脑等于“裸奔”
  2. Mschat控件示例升级错误处理方法
  3. 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )
  4. Java:形式参数问题和返回值问题
  5. 年轻人,拼命奋斗还是保命要紧?
  6. vue-cli 将被 create-vue 替代?初始化基于 vite 的 vue3 项目为何如此简单?
  7. 高等数学下-赵立军-北京大学出版社-题解-练习9.4
  8. python中getopt函数_Python中getopt()函数的使用
  9. linux磁盘管理的命令行,Linux磁盘管理命令
  10. 网站云服务器资料本地备份,云服务器上备份本地数据
  11. openapi回调地址请求不通过_必看!OpenAPI知识来了!
  12. 活水决策体系五:自我觉察与控制
  13. 黑白方格画C++解答
  14. win10右键卡顿问题 简单实用
  15. if单选,双选,多选及switch多选择结构
  16. Fred Books图集
  17. 华为的备胎被迫转正。
  18. 刷屏的海底捞超级APP究竟是怎样与阿里云合作的 1
  19. 基于PythonMagick实现png、jpg批量转ico
  20. js 16进制字符串 转 ArrayBuffer

热门文章

  1. C#:泛型(Generic)
  2. bzoj 1070: [SCOI2007]修车【最小费用最大流】
  3. Unity中的单例方法
  4. MyEclipse在删除文件后servers报错问题解决
  5. 80端口未占用,apache无法启动解决办法
  6. (转)对《javascript 杂谈之哪种写法你更喜欢?》最后一种“匿名函数法”的解释...
  7. QTP中实现对文本文件(txt)的读写操作
  8. mysql用navicat无法远程连接,mysql 发现 navicat 可以远程连接,代码无法远程连接
  9. python的knn算法list_【风马一族_Python】 实施kNN算法
  10. grep 判断不是正则的_Shell—正则表达式(grep命令、sed工具)