TOC

Java double 溢出

遇到一个这样的问题,总数是 t,由 a,b,c 三部分组成。计算 a 的比例,结果算出来一个负数。
原来是 a * 100 这一步溢出了。

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Main {
    public static void main(String[] args) {
        double a = (double) (22890851 * 100) / 26487012;
        System.out.println(a);
        BigDecimal b = new BigDecimal(a);
        System.out.println(b);
        // 警告: [deprecation] BigDecimal中的ROUND_HALF_UP已过时
        // [deprecation] BigDecimal中的setScale(int,int)已过时
        // ROUND_HALF_UP is int
        BigDecimal c = b.setScale(2, RoundingMode.HALF_UP);
        System.out.println(c);
        double d = c.doubleValue();
        System.out.println(d);

        BigDecimal result = new BigDecimal(22890951)
                    .multiply(new BigDecimal(100))
                    .divide(new BigDecimal(26487012), 2, RoundingMode.HALF_UP);
        System.out.println(result);

        System.out.println("HELLO WORLD");
    }
}

OUTPUT

86.42
-75.73078443125257
-75.7307844312525730856577865779399871826171875
-75.73
-75.73
HELLO WORLD