A Java method to calculate the NFL Passer Rating

Note: The current code below is based on the Wikipedia formula, which is not correct. The correct algorithm seems to be at this page.

In working on my “XO Play” Android football game, I just created this Java method to calculate the NFL Passer Rating for my quarterbacks:

private double calculateNflPasserRating(int attempts, int completions, int passingYards, int tds, int ints) {
    if (attempts == 0) return 0;
    double a = ((double)completions  / (double)attempts - 0.3) * 5.0;
    double b = ((double)passingYards / (double)attempts - 3.0) * 0.25;
    double c = ((double)tds          / (double)attempts) * 20.0;
    double d = 2.375 - ((double)ints / (double)attempts * 25.0);
    double passerRating = ( (a+b+c+d) / 6.0 ) * 100.0;
    return (passerRating < 0) ? 0.0 : passerRating;
}

If you haven’t seen it before, that last line uses the Java ternary operator syntax. I usually don’t care for that syntax too much, but it’s okay here.

I got the generic NFL Passer Rating algorithm from this Wikipedia page.

You don’t need all of the `(double)` casts

You don’t need quite as many (double) casts as I show in the code ... this is a better/simpler version of that method:

private double calculateNflPasserRating(int attempts, int completions, int passingYards, int tds, int ints) {
    if (attempts == 0) return 0;
    double a = ((double)completions  / attempts - 0.3) * 5.0;
    double b = ((double)passingYards / attempts - 3.0) * 0.25;
    double c = ((double)tds          / attempts) * 20.0;
    double d = 2.375 - ((double)ints / attempts * 25.0);
    double passerRating = ( (a+b+c+d) / 6.0 ) * 100.0;
    return (passerRating < 0) ? 0.0 : passerRating;
}

According to the Java mixed division rules, all you need is one double within a mixed arithmetic operation to yield a double.

I forgot that rule when writing the passer rating method, and just remembered it as I was typing this up.