Find the discount rate where the NPV of two projects is equal.
Project A Cash Flows
Project B Cash Flows
How to Calculate Crossover Rate on BA II Plus
The crossover rate is the cost of capital at which the Net Present Value (NPV) profiles of two mutually exclusive projects intersect. At this specific rate, both projects are equally attractive because their NPVs are identical.
The Logic Behind the Calculation
To find the crossover rate, you must find the Internal Rate of Return (IRR) of the differences between the two projects' cash flows. Essentially, you subtract Project B's cash flows from Project A's cash flows (or vice versa) for each period and calculate the IRR of that resulting data set.
Step-by-Step BA II Plus Instructions
Follow these keystrokes on your Texas Instruments BA II Plus calculator to find the crossover rate manually:
1. Press [CF] [2nd] [CE/C] to clear any existing data.
2. Calculate the difference for Year 0: (Project A CF0 – Project B CF0).
3. Enter the result in CF0: [Value] [ENTER] [↓].
4. Calculate the difference for Year 1: (Project A CF1 – Project B CF1).
5. Enter the result in C01: [Value] [ENTER] [↓] [↓].
6. Repeat for all remaining years.
7. Press [IRR] [CPT].
Example Calculation
Suppose Project A has an initial cost of 100 and returns 60 in Year 1 and 60 in Year 2. Project B costs 100 and returns 30 in Year 1 and 100 in Year 2.
Year 0 Difference: -100 – (-100) = 0
Year 1 Difference: 60 – 30 = 30
Year 2 Difference: 60 – 100 = -40
Entering (0, 30, -40) into the IRR function on your BA II Plus will yield the crossover rate.
Why the Crossover Rate Matters
If the company's actual cost of capital is less than the crossover rate, the project with the steeper NPV profile (usually the one with cash flows further in the future) is preferred. If the cost of capital is higher than the crossover rate, the projects' rankings may flip, leading to potential conflicts between NPV and IRR decision rules.
function calculateCrossoverRate() {
var resultDiv = document.getElementById('crossover-result-area');
// Collect Cash Flows
var cfA = [
parseFloat(document.getElementById('pA0').value) || 0,
parseFloat(document.getElementById('pA1').value) || 0,
parseFloat(document.getElementById('pA2').value) || 0,
parseFloat(document.getElementById('pA3').value) || 0,
parseFloat(document.getElementById('pA4').value) || 0
];
var cfB = [
parseFloat(document.getElementById('pB0').value) || 0,
parseFloat(document.getElementById('pB1').value) || 0,
parseFloat(document.getElementById('pB2').value) || 0,
parseFloat(document.getElementById('pB3').value) || 0,
parseFloat(document.getElementById('pB4').value) || 0
];
// Calculate Differences
var diffCF = [];
var allZero = true;
for (var i = 0; i < cfA.length; i++) {
var diff = cfA[i] – cfB[i];
diffCF.push(diff);
if (diff !== 0) allZero = false;
}
if (allZero) {
resultDiv.style.display = 'block';
resultDiv.className = 'error-res';
resultDiv.innerHTML = 'Error: The cash flows for both projects are identical. There is no crossover rate because the NPV profiles are the same at all discount rates.';
return;
}
// Solve for IRR of diffCF using Newton-Raphson
var crossoverRate = findIRR(diffCF);
resultDiv.style.display = 'block';
if (crossoverRate === null) {
resultDiv.className = 'error-res';
resultDiv.innerHTML = 'Calculation Failed: No unique crossover rate found within reasonable bounds (0% to 1000%). Ensure your cash flow differences have at least one sign change.';
} else {
resultDiv.className = 'success-res';
resultDiv.innerHTML = '
Crossover Rate: ' + crossoverRate.toFixed(4) + '%
At this discount rate, the NPV of both projects is identical.';
}
}
function findIRR(cashFlows) {
var maxIter = 1000;
var precision = 0.0000001;
var x0 = 0.1; // Initial guess 10%
var x1;
for (var i = 0; i < maxIter; i++) {
var fv = 0;
var dfv = 0;
for (var t = 0; t 0) {
dfv -= t * cashFlows[t] / Math.pow(1 + x0, t + 1);
}
}
x1 = x0 – fv / dfv;
if (Math.abs(x1 – x0) < precision) {
// Check if result is realistic
if (x1 <= -1) return null;
return x1 * 100;
}
x0 = x1;
}
// If first guess fails, try a few other starting points
var guesses = [-0.5, 0.5, 0.9];
for (var g = 0; g < guesses.length; g++) {
x0 = guesses[g];
for (var i = 0; i < 100; i++) {
var fv = 0;
var dfv = 0;
for (var t = 0; t 0) dfv -= t * cashFlows[t] / Math.pow(1 + x0, t + 1);
}
x1 = x0 – fv / dfv;
if (Math.abs(x1 – x0) -1) return x1 * 100;
}
x0 = x1;
}
}
return null;
}