实用数值技术
处理数值精度
十进制格式化
import java.text.DecimalFormat;
public class PrecisionDemo {
public static void main(String[] args) {
double value = 123.456789;
DecimalFormat df = new DecimalFormat("#.##");
String formatted = df.format(value);
System.out.println(formatted); // 输出:123.46
}
}
安全的数值计算
避免溢出
graph TD
A[数值安全] --> B[检查范围]
A --> C[使用 BigInteger]
A --> D[验证输入]
范围检查示例
public class SafeCalculationDemo {
public static int safeAdd(int a, int b) {
// 检查是否可能溢出
if (a > Integer.MAX_VALUE - b) {
throw new ArithmeticException("整数溢出");
}
return a + b;
}
}
高级数值技术
使用 BigDecimal 进行精确计算
操作 |
基本类型 |
BigDecimal |
精度 |
有限 |
精确 |
舍入 |
不精确 |
可配置 |
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal result = a.add(b);
// 精确舍入
BigDecimal rounded = result.setScale(2, RoundingMode.HALF_UP);
System.out.println(rounded); // 0.30
}
}
数值验证技术
输入验证策略
public class NumericValidationDemo {
public static boolean isValidNumber(String input) {
try {
Double.parseDouble(input);
return true;
} catch (NumberFormatException e) {
return false;
}
}
public static void main(String[] args) {
String validInput = "123.45";
String invalidInput = "abc";
System.out.println(isValidNumber(validInput)); // true
System.out.println(isValidNumber(invalidInput)); // false
}
}
性能优化
数值缓存技术
public class NumericCacheDemo {
// 缓存频繁使用的数值
private static final int[] COMMON_INTEGERS = new int[100];
static {
for (int i = 0; i < COMMON_INTEGERS.length; i++) {
COMMON_INTEGERS[i] = i;
}
}
public static int getCachedInteger(int value) {
return (value >= 0 && value < COMMON_INTEGERS.length)
? COMMON_INTEGERS[value]
: value;
}
}
LabEx 数值最佳实践
- 使用合适的数值类型
- 实现健壮的错误处理
- 考虑内存和性能影响
- 彻底验证数值输入
高级数值模式
数值转换的工厂方法
public class NumericConverter {
public static Number convertToNumber(String input) {
try {
// 智能类型转换
if (input.contains(".")) {
return Double.parseDouble(input);
} else {
return Long.parseLong(input);
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException("无效的数值输入");
}
}
}
关键要点
- 始终验证数值输入
- 使用合适的精度技术
- 了解基本类型的局限性
- 利用 Java 的数值实用类