1. 数字类型间的转换
类型 double
, float
, long
, int
都是 Java 中原始的数字类型. Java 提供了这原始类型的包装类, 并提供了一些便于使用的方法比如类型的转换, 通过字符串解析, 字符串转换等. 具体原始类型的包装类型如下表:
原始类型 | 对应的包装类 |
double | java.lang.Double |
float | java.lang.Float |
long | java.lang.Long |
int | java.lang.Integer |
所有上述的包装类都继承自抽象类 java.lang.Numer
, 而 Number
类中定义了 doubleValue()
, floatValue()
, longValue()
和 intValue()
这些抽象方法, 因此作为它的实现子类, 也都带有这些方法. 这样只要使用对应的封装类初始化了一个对应的封装类的对象, 就能很容易的通过上述方法转换成其他类型的数字了.
这样数字类型间的转换, 只需要两步:
- 使用数字原始类型对应的封装类的 valueOf() 方法构建一个封装类的示例(早期版本的java 可能是实例化方法)
- 简单的调用这个实例的各种
xxxValue()
的方法转换到目标值
需要注意的是, 从占位更多的数字类型转换到占位更少的数字类型, 比如 Double 到其他数字类, 可能会丢失数据, 数值溢出或返回 Infinity
, 示例如下:
将各中类型的数字的最大值转换成其他值的示例:
package com.yi21.article;
public class Yi21NumberConversion {
public static void main(String[] args) {
showNumber(Double.valueOf(Double.MAX_VALUE - 1), "Double");
line();
showNumber(Float.valueOf(Float.MAX_VALUE), "Float");
line();
showNumber(Long.valueOf(Long.MAX_VALUE), "Long");
line();
showNumber(Integer.valueOf(21), "Integer");
}
private static void showNumber(Number n, String type) {
System.out.println("数字 n 的类型: " + type);
System.out.println("数字 n 的 double 形式的值: " + n.doubleValue());
System.out.println("数字 n 的 float 形式的值: " + n.floatValue());
System.out.println("数字 n 的 long 形式的值: " + n.longValue());
System.out.println("数字 n 的 int 形式的值: " + n.intValue());
}
private static void line() {
System.out.println("-".repeat(40));
}
}
以上代码执行结果如下:
数字 n 的类型: Double
数字 n 的 double 形式的值: 1.7976931348623157E308
数字 n 的 float 形式的值: Infinity
数字 n 的 long 形式的值: 9223372036854775807
数字 n 的 int 形式的值: 2147483647
----------------------------------------
数字 n 的类型: Float
数字 n 的 double 形式的值: 3.4028234663852886E38
数字 n 的 float 形式的值: 3.4028235E38
数字 n 的 long 形式的值: 9223372036854775807
数字 n 的 int 形式的值: 2147483647
----------------------------------------
数字 n 的类型: Long
数字 n 的 double 形式的值: 9.223372036854776E18
数字 n 的 float 形式的值: 9.223372E18
数字 n 的 long 形式的值: 9223372036854775807
数字 n 的 int 形式的值: -1
----------------------------------------
数字 n 的类型: Integer
数字 n 的 double 形式的值: 21.0
数字 n 的 float 形式的值: 21.0
数字 n 的 long 形式的值: 21
数字 n 的 int 形式的值: 21
2. 字符串转换成数字
将字符串转换成数字主要依赖于 valueOf(String s)
方法, 他们实际调用的都是各自的 parseXX()
方法, 比如 Double
的 parseDouble()
, Long
的 parseLong()
方法. 而他们的主要差别在于 parseXX()
方法返回的是原始类型, 而 valueOf()
方法返回的是原始类型对应的封装类. 其中, Long
和 Integer
还拥有 valueOf(String s, int radix)
方法用以解析不同进制数字的字符串, 可选的进制数量在 Java 11 版本中是 2 - 36. 具体的使用示例如下:
解析各类字符串到数字的示例:
package com.yi21.article;
public class Yi21NumberParseString {
public static void main(String[] args) {
System.out.println("--- Double 解析示例: ");
String s = "-3.3212e19";
System.out.println(Double.valueOf(s));
s = "-5.141f";
System.out.println(Double.valueOf(s));
//非数字
s = "NaN";
System.out.println(Double.valueOf(s));
System.out.println(Double.parseDouble(s));
System.out.println("---- Float 转换示例: ");
//无穷大
s = "Infinity";
System.out.println(Float.valueOf(s));
s = ".73";
System.out.println(Float.valueOf(s));
//十六进制数
s = "0X10002.2p2 ";
System.out.println(Float.valueOf(s));
System.out.println(Float.parseFloat(s));
System.out.println("----- Long 转换示例: ");
//三十六进制数
s = "1y2p0ij32e8e7";
System.out.println(Long.valueOf(s, 36));
s = "21";
System.out.println(Long.valueOf(s));
System.out.println("-- Integer 转换示例: ");
//三十六进制数
s = "21yi";
System.out.println(Integer.valueOf(s, 36));
//三十五进制数
s = "21yi";
System.out.println(Integer.valueOf(s, 35));
s = "21";
System.out.println(Integer.valueOf(s));
try {
s = "Double.MAX";
System.out.println(Double.valueOf(s));
} catch (NumberFormatException e) {
System.out.println("解析 Double 出错了: " + e.getMessage());
}
try {
//无穷大
s = "Infinity";
System.out.println(Long.valueOf(s));
} catch (NumberFormatException e) {
System.out.println("解析 Long 出错了: " + e.getMessage());
}
}
}
以上代码执行结果如下:
--- Double 解析示例:
-3.3212E19
-5.141
NaN
NaN
---- Float 转换示例:
Infinity
0.73
262152.5
262152.5
----- Long 转换示例:
9223372036854775807
21
-- Integer 转换示例:
95850
88183
21
解析 Double 出错了: For input string: "Double.MAX"
解析 Long 出错了: For input string: "Infinity"
3. 数字转换成字符串
将数字转换成字符串主要依赖于 toString()
方法, 但同时各类又提供了 toHexString()
方法将当前数字转换成16进制字符串, 而 Long
和 Integer
类额外提供了 toBinaryString()
和 toOctalString()
方法, 来分别将数字转换成 二进制字符串和八进制字符串. 以下是使用示例:
将各种数字转换到各种进制字符串的示例:
package com.yi21.article;
public class Yi21NumberToString {
public static void main(String[] args) {
Double d = Double.MAX_VALUE;
System.out.println("d 转换成字符串: " + d.toString());
System.out.println("d 转换成十六进制字符串: " + Double.toHexString(d));
Float f = Float.MAX_VALUE;
System.out.println("f 转换成字符串: " + f.toString());
System.out.println("f 转换成十六进制字符串: " + Float.toHexString(f));
Long l = Long.MAX_VALUE;
System.out.println("l 转换成字符串: " + l.toString());
System.out.println("l 转换成二进制字符串: " + Long.toBinaryString(l));
System.out.println("l 转换成八进制字符串: " + Long.toHexString(l));
System.out.println("l 转换成十六进制字符串: " + Long.toHexString(l));
Integer i = Integer.MAX_VALUE;
System.out.println("i 转换成字符串: " + i.toString());
System.out.println("i 转换成二进制字符串: " + Integer.toBinaryString(i));
System.out.println("i 转换成八进制字符串: " + Integer.toHexString(i));
System.out.println("i 转换成十六进制字符串: " + Integer.toHexString(i));
}
}
以上代码执行结果如下:
d 转换成字符串: 1.7976931348623157E308
d 转换成十六进制字符串: 0x1.fffffffffffffp1023
f 转换成字符串: 3.4028235E38
f 转换成十六进制字符串: 0x1.fffffep127
l 转换成字符串: 9223372036854775807
l 转换成二进制字符串: 111111111111111111111111111111111111111111111111111111111111111
l 转换成八进制字符串: 7fffffffffffffff
l 转换成十六进制字符串: 7fffffffffffffff
i 转换成字符串: 2147483647
i 转换成二进制字符串: 1111111111111111111111111111111
i 转换成八进制字符串: 7fffffff
i 转换成十六进制字符串: 7fffffff