Java 数字


Java中的基本数据类型中有6种数字类型byte、short、int、long、float、double。


基本数据类型的数字类型对应的包装类为Byte、Short、Integer、Long、Float、Double。除了这六种外,还有4种数字类型,BigDecimal、BigInteger用于高精度计算。AtomicInteger、AtomicLong用在多线程程序。这十种数字类型都是抽象类Number的子类。

基本数据类型和对应的包装类在需要时会自动互相转换,称为装箱(box)和拆箱(unbox)。

数字和字符串转换

数字包装类提供了一些常量,如最大值和最小值。提供一些实用操作用于数字和字符串的互相转换、数字类型之间的互相转换、数字进制(2、8、10、16进制)之间的转换。

下面是数字和字符串转换的例子。

public class NumberConvert {
    public static void main(String[] args) {
        int i = 0b1111_1111_1111_1111_1111_1111_1111_1111;
        System.out.println("i = " + i);    // -1

        System.out.println((byte)i);    // -1
        System.out.println(new Integer(i).byteValue());    // -1

        System.out.println(Integer.parseInt("FE", 16));    // 254
        System.out.println(Integer.toHexString(80));    // 50
    }
}

格式化数字输出

System.out是一个PrintStream对象,有两个方法printfformat用于输出格式化字符串。格式字符串包含一般文本和格式描述符。格式描述符以一个%开始,以一个转换符结束。%和转换符之间是可选的标志。

转换符有下面3种:

  • d,十进制整数。
  • f,浮点数。
  • n,换行符。

标志有下面7种:

  • +,显示符号,正数显示+,负数显示-。
  • -,数字向左对齐。
  • ,,本地化的数字分组字符。
  • x,x为一个整数,例如8表示显示数字宽度为8,如果数字长度不够5,左边填充空格。
  • 0x,x为一个整数,例如05表示显示数字宽度为5,如果数字长度不够5,左边填充0。
  • .x,x为一个整数,例如.2表示小数点后保留2位小数。
  • x.y,x和y为整数,例如8.3表示数字长度为8,保留3位小数,数字向右对齐。

下面是格式化数字输出的例子。

public class NumberStr {
    public static void main(String[] args) {
        int i = 1234567;
        float f = 1234.567f;
        System.out.format("%d%n", i);        // 1234567
        System.out.format("%+d%n", i);    // +1234567
        System.out.format("%,d%n", i);    // 1,234,567
        System.out.format("%10d%n", i);    //   1234567
        System.out.format("%-10d%n", i);    // 1234567
        System.out.format("%010d%n%n", i);    // 0001234567

        System.out.format("%f%n", f);        // 1234.567017
        System.out.format("%+f%n", f);    // +1234.567017
        System.out.format("%,f%n", f);    // 1,234.567017
        System.out.format("%12f%n", f);    //  1234.567017
        System.out.format("%.3f%n", f);    // 1234.567
        System.out.format("%10.3f%n", f);    //  1234.567
        System.out.format("%-10.3f%n", f);    // 1234.567
    }
}


使用格式化类

DecimalFormat类使用模式来控制数字前后0的填充、前后缀、数字分组。

模式有下面几种:

  • ###,###.####表示一个数字。
  • $###,###.###$在最前面表示美元符号。
  • ##0.#####E0E0在最后面表示转换成科学计数法。
  • 000,000.0000指定数字前后0的填充。

下面是格式化类的例子:

import java.text.DecimalFormat;

public class NumberFmt {
    public static void main(String[] args) {
        double d = 1234.5678d;
        System.out.println(new DecimalFormat("###,###.###").format(d));        // 1,234.568
        System.out.println(new DecimalFormat("$###,###.###").format(d));    // $1,234.568
        System.out.println(new DecimalFormat("000,000.000").format(d));        // 001,234.568
        System.out.println(new DecimalFormat("#.###E0").format(d));                // 1.235E3
    }
}

算术运算

除了+、-、*、/、%等运算符,Math类提供了常量和更多的方法用来做算术运算。例如四舍五入、求绝对值、求最大最小值、乘方运算、指数和对数运算、得到随机数等。

下面是Math类提供的算术运算的例子。

public class Mathematic {
    public static void main(String[] args) {
        System.out.println(Math.abs(-1.23));        // 1.23
        System.out.println(Math.ceil(-1.23));        // -1.0
        System.out.println(Math.floor(-1.23));    // -2.0
        System.out.println(Math.round(-1.23));    // -1
        System.out.println(Math.max(-1.23, -1));    // -1.0

        System.out.println();
        System.out.println(Math.exp(2));    // 7.38905609893065
        System.out.println(Math.log(2));    // 0.6931471805599453
        System.out.println(Math.pow(2, 3));    // 8.0
        System.out.println(Math.sqrt(2));    // 1.4142135623730951
        System.out.println(Math.random());    // 0.42512282507286836
    }
}

随机数和范围是0.0到1.0,但不包含1.0。