Java 中各数字类型(Double, Float, Long, Integer) 之间以及字符串之间的转换

1. 数字类型间的转换

类型 doublefloatlongint 都是 Java 中原始的数字类型. Java 提供了这原始类型的包装类, 并提供了一些便于使用的方法比如类型的转换, 通过字符串解析, 字符串转换等. 具体原始类型的包装类型如下表:

原始类型对应的包装类
doublejava.lang.Double
floatjava.lang.Float
longjava.lang.Long
intjava.lang.Integer

所有上述的包装类都继承自抽象类 java.lang.Numer, 而 Number 类中定义了 doubleValue()floatValue()longValue() 和 intValue() 这些抽象方法, 因此作为它的实现子类, 也都带有这些方法. 这样只要使用对应的封装类初始化了一个对应的封装类的对象, 就能很容易的通过上述方法转换成其他类型的数字了.

这样数字类型间的转换, 只需要两步:

  1. 使用数字原始类型对应的封装类的 valueOf() 方法构建一个封装类的示例(早期版本的java 可能是实例化方法)
  2. 简单的调用这个实例的各种 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

本文首发地址icon-default.png?t=M1L8https://21yi.com/a/170471860012584960.html

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值