System.out.println(19.99 + 20); // 39.989999999999995
System.out.println(1.0 - 0.66); // 0.33999999999999997
System.out.println(0.033 * 100); // 3.3000000000000003
System.out.println(12.3 / 100); // 0.12300000000000001
// 錯誤:double 轉 String 再構造 BigDecimal,精度已損失
BigDecimal bd = new BigDecimal(0.1);
// 正確:直接用字符串構造
BigDecimal bd = new BigDecimal("0.1");
public class DecimalUtil {
// 加
public static double add(String a, String b) {
return new BigDecimal(a).add(new BigDecimal(b)).doubleValue();
}
// 減
public static double sub(String a, String b) {
return new BigDecimal(a).subtract(new BigDecimal(b)).doubleValue();
}
// 乘
public static double mul(String a, String b) {
return new BigDecimal(a).multiply(new BigDecimal(b)).doubleValue();
}
// 除(指定精度、四捨五入)
public static double div(String a, String b, int scale) {
return new BigDecimal(a).divide(new BigDecimal(b), scale, RoundingMode.HALF_UP).doubleValue();
}
}
// 測試
public static void main(String[] args) {
String a = "3.14159267", b = "2.358";
System.out.println("add: " + DecimalUtil.add(a, b)); // 5.49959267
System.out.println("sub: " + DecimalUtil.sub(a, b)); // 0.78359267
System.out.println("mul: " + DecimalUtil.mul(a, b)); // 7.40787551586
System.out.println("div: " + DecimalUtil.div(a, b, 8)); // 1.33231241
}
商業計算嚴禁使用 float/double。全鏈路使用
String存儲數值,計算時轉BigDecimal,結果再轉String或double(僅用於展示)。
Java 遵循 IEEE 754 標準,採用科學計數法:值 = 符號 × 尾數 × 2^指數。詳細位級存儲與運算邏輯可參考《深入理解 Java 虛擬機器》相關章節。