java i= i_java中 i!=i+1?你错了。 | 学步园
今天被老师问到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?你错了。 | 学步园相关推荐
- java角度_java中角度或弧度的计算 | 学步园
math中调用tan()的反三角函数. 应该表达为 (角度/180度)* π(3.14)= Math.atan((dpPoint.y-dpCenter.y) / (dpPoint.x-dpCenter ...
- java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园
定时器的应用 1. 定时器主要涉及到两个类(java.util包中) @->public class Timer extendsObject (一种工具,线程用其安排以后在后台线程中执行的任务 ...
- java调用存储过程sqlserver_Java调用SqlServer存储过程怎么实现 | 学步园
在使用Java开发时,经常会遇到调用SqlServer存储过程的问题.下面学步园小编来讲解下Java调用SqlServer存储过程怎么实现? Java调用SqlServer存储过程怎么实现 1.数据库 ...
- mysql 枚举字段,MySQL字段中的枚举是什么意思 | 学步园
MySQL字段相信大家都有一些了解,为您介绍的是MySQL字段中的枚举,希望对您学习MySQL字段方面能够有所帮助.下面学步园小编来讲解下MySQL字段中的枚举是什么意思? MySQL字段中的枚举是什 ...
- java 负数存储结构_负数在java中的存储和读取过程 | 学步园
问题描述: 将-5存储在文本文件中,再读取出来显示到控制台; 预备知识: 1.在java中使用补码处理数字,而且byte(8)的数字在扩展成int(32)类型的时候,正数填充0,负数填充1; 2.负数 ...
- java调c++代码_Java中调用C++代码的实现 | 学步园
JNI为 Java Native Interface 即Java本地接口,使用此种方式可以对C/C++代码进行调用,其在本质上是对C/C++生成的动态库进行调用而不是直接对C/C++代码进行调用 J ...
- java同时关闭两个窗口_在一个窗口中同时关闭多个窗口的问题(Swing中事件多点传送的问题) | 学步园...
class A{} A中包含有: JFrame frameA; JButton btnA; class B{} B中包含有: final JFrame frameB; Stat ...
- java 点到点最短路径,迪杰斯特拉算法处理无向图中最短路径的(dijkstra)Java实现(指定两点,求最短距离及路径) | 学步园...
其实不是原创哈,我写不出来. 如何求图中V0到V5的最短路径呢? java实现的方式如下: 第一步,根据图来建立权值矩阵: int[][] W = { { 0, 1, 4, -1, -1 ...
- java biginteger使用_java中的BigInteger的基本用法 | 学步园
注 : 为了更好的理解BigInteger类,特提供了一篇关于BigInteger的题目及本人的解答,感兴趣的朋友可以到我的博客看一下 import java.math.BigInteger; pub ...
最新文章
- Python初学者请注意!别这样直接运行python命令,否则电脑等于“裸奔”
- Mschat控件示例升级错误处理方法
- 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )
- Java:形式参数问题和返回值问题
- 年轻人,拼命奋斗还是保命要紧?
- vue-cli 将被 create-vue 替代?初始化基于 vite 的 vue3 项目为何如此简单?
- 高等数学下-赵立军-北京大学出版社-题解-练习9.4
- python中getopt函数_Python中getopt()函数的使用
- linux磁盘管理的命令行,Linux磁盘管理命令
- 网站云服务器资料本地备份,云服务器上备份本地数据
- openapi回调地址请求不通过_必看!OpenAPI知识来了!
- 活水决策体系五:自我觉察与控制
- 黑白方格画C++解答
- win10右键卡顿问题 简单实用
- if单选,双选,多选及switch多选择结构
- Fred Books图集
- 华为的备胎被迫转正。
- 刷屏的海底捞超级APP究竟是怎样与阿里云合作的 1
- 基于PythonMagick实现png、jpg批量转ico
- js 16进制字符串 转 ArrayBuffer
热门文章
- C#:泛型(Generic)
- bzoj 1070: [SCOI2007]修车【最小费用最大流】
- Unity中的单例方法
- MyEclipse在删除文件后servers报错问题解决
- 80端口未占用,apache无法启动解决办法
- (转)对《javascript 杂谈之哪种写法你更喜欢?》最后一种“匿名函数法”的解释...
- QTP中实现对文本文件(txt)的读写操作
- mysql用navicat无法远程连接,mysql 发现 navicat 可以远程连接,代码无法远程连接
- python的knn算法list_【风马一族_Python】 实施kNN算法
- grep 判断不是正则的_Shell—正则表达式(grep命令、sed工具)