跳到主要内容

Java 中的算术运算与浮点数精度

字符串拼接

在 Java 中,当字符串与其他类型的变量相加时,其他类型会被转换为字符串并进行拼接。需要注意,字符串是引用类型。

float pi = 3.14f;
int count = 2;
boolean isValid = true;
String greeting = "Hello World";

// 字符串拼接
System.out.printf(greeting + pi + count + isValid); // Hello World3.142true

上述代码中,greetingpicountisValid相加,结果是将各个变量转换为字符串后拼接在一起。

char类型参与运算

char类型的变量参与算术运算时,字符会被转换为对应的 Unicode 码值(整数)进行计算。

int multiplier = 10;
char letter = 'b';

System.out.println(multiplier * letter); // 980

字符'b'的 Unicode 码值是 98,因此计算结果为10 * 98 = 980

字符串不能参与乘除减运算

在 Java 中,字符串属于对象类型(Object),不是基本数据类型(Primitive Type)。基本数据类型可以参与加、减、乘、除等算术运算,但对象类型(包括字符串)不能直接进行这些运算。

整数相除

当整数相除时,如果两个操作数都是整数,结果会进行整数除法,舍弃小数部分。如果希望得到浮点数结果,可以将其中一个操作数强制转换为floatdouble类型。

int numerator = 20;
int denominator = 8;

// 强制转换为浮点数,得到精确的除法结果
System.out.println((float) numerator / denominator); // 2.5

// 求余数
System.out.println(numerator % denominator); // 4

除数不能为零

在 Java 中,整数除法时,除数不能为零,否则会抛出ArithmeticException异常。

int numerator = 10;
int denominator = 0;

System.out.println(numerator / denominator); // 抛出 ArithmeticException: / by zero

无穷大(Infinity)

当使用浮点数除以零时,Java 不会抛出异常,而是返回正无穷大Infinity或负无穷大-Infinity

System.out.println(1.0 / 0);   // Infinity
System.out.println(-1.0 / 0); // -Infinity

这是因为浮点数运算遵循 IEEE 754 标准,允许用特殊值表示无穷大。

非数字(NaN)

当计算结果无法表示为一个实数时,Java 会返回NaN(Not a Number)。

System.out.println(0.0 / 0);    // NaN
System.out.println(-0.0 / 0); // NaN

0.0 / 0.0的结果是未定义的,因此返回NaN

自增运算符

自增运算符++有前置和后置两种形式,分别是++numbernumber++

  • number++(后置自增):先使用变量的值,再执行自增操作。
  • ++number(前置自增):先执行自增操作,再使用变量的值。
int number = 1;

System.out.println(number++); // 输出 1,number 变为 2
System.out.println(++number); // number 先变为 3,输出 3

浮点数运算的精度问题

精确计算

在某些情况下,浮点数运算可以得到精确的结果。

System.out.println(2.5f - 0.5f); // 输出 2.0

上述计算结果准确无误,因为浮点数能够精确表示这些值。

精度丢失

由于计算机中浮点数的存储方式,某些浮点数运算可能会出现精度丢失。

System.out.println(3.3f - 1.4f); // 输出 1.9000001

这是因为浮点数在二进制表示时,有些小数无法精确表示,导致运算结果存在微小误差。

注意事项

浮点数运算可能存在精度问题,尤其是在金融计算等对精度要求高的场合,建议使用BigDecimal类进行精确计算。