测试遇到以下这个题目:
假如有double x = 9.789, y=1.0; 则 (“”+x+y) 的值是_,y/0的值是__ 。
刚看到第一个空时,以为”“为空,x和y可以直接进行算数运算,所以就自以为然的写了10.789…….,结果当然是错的!!!
在Java核心技术 卷Ⅰ——3.6.2中提到字符串拼接相关问题。
与绝大多数的程序设计语言一样,Java语言允许使用+号连接(拼接)两个字符串。
String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;
上述代码将“Explectivedeleted”赋给变量message(注意,单词之间没有空格,+号按照给定的次序将两个字符串拼接起来)。
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串(任何一个Java对象都可以转换成字符串)。例如:
int age = 13;
String rating = "PG" + age;
rating设置为“PG13”。
如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:
String all = String.join("/","S","M","L","XL");
//all is the string "S/M/L/XL"
NaN:Not a Number,查看JDK1.8手册得到NaN的定义,float和double类型均有自己定义的NaN,如下:
java.lang.Float下的NaN:
public static final float NaN = 0f/0f;
恒持非数字(NaN) float型价值。它相当于返回的值 Float.intBitsToFloat(0x7fc00000)。
java.lang.Double下的NaN:
public static final double NaN = 0d/0d;
恒持非数字(NaN) double型价值。它相当于返回的值 Double.longBitsToDouble(0x7ff8000000000000L)。
对于所有没有良好的数字定义的浮点计算,或者对负数求平方根其值都是它。例如:
System.out.println(0/0.0);
System.out.println(0.0/0);
System.out.println(0.0/0.0);
System.out.println(Math.sqrt(-6));
结果都为NaN。
规范中描述道,NaN 不等于任何浮点数值,包括它自身在内。 任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。
对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。
IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达 NaN,比如 Java中的常量 Float.NaN 的浮点数可能表达为 01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。
Java 中甚至允许程序员自己构造具有特定位模式的 NaN 值(通过 Float.intBitsToFloat() 方法)。比如,程序员可以利用这种定制的 NaN 值中的特定位模式来表达某些诊断信息。
定制的 NaN 值,可以通过 Float.isNaN() 方法判定其为 NaN,但是它和 Float.NaN 常量却不相等。实际上,所有的 NaN 值都是无序的。数值比较操作符 <,<=,> 和 >= 在任一操作数为 NaN 时均返回 false。等于操作符 == 在任一操作数为 NaN 时均返回 false,即使是两个具有相同位模式的 NaN 也一样。而操作符 != 则当任一操作数为 NaN 时返回 true。这个规则的一个有趣的结果是 x!=x 当 x 为 NaN 时竟然为真。
可以产生 NaN 的操作如下所示:
此外,任何有 NaN 作为操作数的操作也将产生 NaN。用特殊的 NaN 来表达上述运算错误的意义在于避免了因这些错误而导致运算的不必要的终止。
比如,如果一个被循环调用的浮点运算方法,可能由于输入的参数问题而导致发生这些错误,NaN 使得 即使某次循环发生了这样的错误,也可以简单地继续执行循环以进行那些没有错误的运算。
你可能想到,既然 Java 有异常处理机制,也许可以通过捕获并忽略异常达到相同的效果。但是,要知道,IEEE 标准不是仅仅为 Java 而制定的,各种语言处理异常的机制不尽相同,这将使得代码的迁移变得更加困难。何况,不是所有语言都有类似的异常或者信号(Signal)处理机制。
注意: Java 中,不同于浮点数的处理,整数的 0 除以 0 将抛出 java.lang.ArithmeticException 异常。
具体介绍可参考浮点数知识
即第二个空应该填写Infinity
Infinity:无穷大,查看JDK1.8手册得到Infinity的定义,float和double类型均有自己定义的NaN,如下:
java.lang.Float下的Infinity:
public static final float NEGATIVE_INFINITY = -1f/0f;
一个恒定的持有型 float正无穷大。它等于返回的值 Float.intBitsToFloat(0x7f800000)。
public static final float POSITIVE_INFINITY = 1f/0f;
一个恒定的持有型 float正无穷大。它等于返回的值 Float.intBitsToFloat(0x7f800000)。
java.lang.Double下的Infinity:
与float的同理,只是返回的值有所不同。
可以看出,当被除数为浮点数(且不能为0或0.0)或被除数为0.0时,控制台输出的结果都为Infinity。
而当出现以下情况时,会报出错误信息:
System.out.println(1/0);
Exception in thread “main” java.lang.ArithmeticException: / by zero
注意:这种错误和我们所熟知的数学定义相对应。而对于浮点数对0进行的除法操作,却不会出现错误,而是Infinity!
值得注意的是:
double i = 6.0 / 0;
System.out.print(i); //Infinity
System.out.print(i + 1); //Infinity
System.out.print(i == i + 1); //true
i = 0.0 / 0;
System.out.print(i); //NaN
System.out.print(i + 1); //NaN
System.out.print(i == i + 1); //false
参考:Java中的Infinity和NaN