在Java中用两个长整数计算百分比的溢出安全方法

Ste*_*eod 13 java

我有两个非负长.它们可能很大,接近Long.MAX_VALUE.我想从两个数字中计算一个百分比.

通常我会这样做:

    long numerator = Long.MAX_VALUE / 3 * 2;
    long denominator = Long.MAX_VALUE;

    int percentage = (int) (numerator * 100 / denominator);
    System.out.println("percentage = " + percentage);
Run Code Online (Sandbox Code Playgroud)

如果分子在Long.MAX_VALUE的两个数量级内,则这是不正确的.

什么是正确,简单,快速的方法?

NPE*_*NPE 14

我用的是:

int percentage = (int)(numerator * 100.0 / denominator + 0.5);
Run Code Online (Sandbox Code Playgroud)

100.0部队从该点浮点数学运算,并+ 0.5四舍五入为最接近的整数,而不是截断.


ese*_*sej 7

int percentage = (int) (0.5d + ((double)numerator/(double)denominator) * 100);
Run Code Online (Sandbox Code Playgroud)

如果你将a除以a long,long你会得到一个long,这对百分比来说并不好.