Java基本算术运算符为+、-、*、/、%,整数除法截断小数,浮点运算需至少一操作数为浮点型;%支持浮点但有精度误差;优先级同数学,括号可改变顺序;int与double混合时自动提升为double,强转需显式且向零截断;Math类提供abs等安全函数。
Java的加减乘除取余直接用 +、-、*、/、%,但要注意整数除法会截断小数部分,比如 7 / 2 结果是 3,不是 3.5。
7.0 / 2 或 7 / 2.0
% 只支持整数和浮点数,但浮点取余可能有精度误差,比如 5.5 % 2.1 结果不一定是精确的 1.3
Java会自动做「数值提升」:当 int 和 double 一起参与运算,int 会被转成 double,整个表达式结果是 double。但这个过程不可逆,不会自动缩回 int。
int a = 5; double b = 2.0; var result = a + b; → result 类型是 double
int,必须显式强转:int c = (int)(a + b);,但会丢掉小数部分(int)3.9 是 3,(int)-3.9 是 -3(向零截断)基础四则不够用时,Math 类提供更安全、更通用的数学能力,比如避免除零、处理边界值、跨类型计算。
Math.abs(x):比 x 更可靠,对 Integer.MIN_VALUE 也能返回正确绝对值
Math.max(a, b) / Math.min(a, b):支持所有数字类型重载,不用自己写比较逻辑Math.pow(2, 10) 返回 double,注意结果可能有浮点误差;需要整数幂可用循环或 BigInteger
Math.round(3.7) 返回 long,等价于 (long)Math.floor(x + 0.5);想四舍五入到指定位数,得自己处理,比如 Math.round(x * 100.0) / 100.0
这不是Java的问题,而是二进制浮点数表示限制导致的精度丢失。double 和 float 都无法精确表示大多数十进制小数。
立即学习“Java免费学习笔记(深入)”;
System.out.println(0.1 + 0.2 == 0.3);输出
false
Math.abs(a - b)
BigDecimal,但要注意构造函数别用 double 参数:new BigDecimal(0.1) 仍会带入二进制误差;应写成 new BigDecimal("0.1")
实际写业务逻辑时,最容易被忽略的是浮点比较和 BigDecimal 的字符串构造方式——这两个点一旦出错,问题往往延迟暴露,且难以复现。