// 第 1 周 – 由表示范围的局限引起的“意外”
// 运行：java Pitfalls.java
public class Pitfalls {
    public static void main(String[] args) {
        // 1. 溢出：int 用 32 位存储；超过最大值后会“回绕”。
        int max = Integer.MAX_VALUE;
        System.out.println("MAX_VALUE     = " + max);
        System.out.println("MAX_VALUE + 1 = " + (max + 1)); // -2147483648

        // byte 也一样，只是范围更小：127 + 1 = -128
        byte b = 127;
        b++;
        System.out.println("(byte) 127 + 1 = " + b);

        // 2. 整数除法：两个整数的商是整数，小数部分丢失。
        System.out.println("7 / 2   = " + (7 / 2));    // 3
        System.out.println("7 % 2   = " + (7 % 2));    // 1（余数）
        System.out.println("7 / 2.0 = " + (7 / 2.0));  // 3.5

        // 典型错误：摄氏度 -> 华氏度
        double celsius = 100;
        System.out.println("Wrong:   " + (9 / 5 * celsius + 32));   // 9/5 == 1 !
        System.out.println("Correct: " + (9.0 / 5 * celsius + 32));

        // 3. 浮点误差：0.1 在二进制中是无限小数。
        double sum = 0.1 + 0.2;
        System.out.println("0.1 + 0.2 = " + sum);           // 0.30000000000000004
        System.out.println("0.1 + 0.2 == 0.3 ? " + (sum == 0.3));

        // 因此实数要带容差比较：
        final double EPS = 1e-9;
        System.out.println("|sum - 0.3| < EPS ? " + (Math.abs(sum - 0.3) < EPS));

        // 4. 类型转换：收窄可能丢失数据。
        double pi = 3.99;
        int truncated = (int) pi;   // 截断，不是四舍五入
        System.out.println("(int) 3.99 = " + truncated);
        System.out.println("Math.round(3.99) = " + Math.round(pi));

        int large = 300;
        byte small = (byte) large;  // 300 = 1 0010 1100 -> 最低 8 位：0010 1100 = 44
        System.out.println("(byte) 300 = " + small);
    }
}
