protected Float getTotalPercentCompleteAsFloat() {
        long totalPoints = 0;
        for (float weight : this.phaseWeights) {
            totalPoints += weight * 100;
        }
        
        Float percentThisPhase = getPercentCompleteOfThisPhaseAsFloat();
        
        if (percentThisPhase == null) {
            // If we can't know the percentage for this phase, use a
            // conservative estimate.
            percentThisPhase = 0.0f;
        }
        
        long pointsSoFar = 0;
        for (int ix = 0; ix < this.currentPhase-1; ix++) {
            // We get full points for (all the phases completed prior to this one.
            pointsSoFar += phaseWeights[ix] * 100;
        }
            
        pointsSoFar += percentThisPhase * this.phaseWeights[this.currentPhase-1];
        
        if (totalPoints <= 0.0 || pointsSoFar > totalPoints) {
            return null;
        }
        else {
            return (100.0f * pointsSoFar) / totalPoints;
        }
    }