Basic Allowance for Housing depends on location. Enter manually.
Include BAS (Subsistence)
Monthly Basic Pay$0.00
Monthly BAS (Food)$0.00
Monthly BAH (Housing)$0.00
Total Monthly Gross$0.00
Estimated Annual Gross$0.00
Understanding Your Military Compensation
Military pay is a composite of several different types of compensation. While civilians typically receive a single salary, U.S. Service Members receive a combination of Basic Pay, Allowances, and potential Bonuses. This calculator helps estimated your Regular Military Compensation (RMC) based on the 2024 pay scales.
1. Basic Pay
Basic Pay is the fundamental component of military salary. It is determined primarily by two factors:
Pay Grade (Rank): Ranging from E-1 (Enlisted) to O-10 (General/Admiral).
Years of Service: Pay generally increases every two years of service, known as longevity increases.
For example, an E-5 with 6 years of service will earn significantly more than an E-5 with 2 years of service, despite holding the same rank. Pay scales are set by Congress and typically adjusted annually for cost of living.
2. Basic Allowance for Housing (BAH)
BAH is a non-taxable allowance meant to offset the cost of housing when you do not live in government-provided quarters. This is one of the most variable parts of military compensation because it is based on:
Duty Station Zip Code: High-cost-of-living areas (like San Diego or DC) have much higher rates than rural bases.
Dependency Status: Service members with dependents (spouse/children) receive a higher rate ("BAH with Dependents").
Note: Because BAH varies by thousands of zip codes, this calculator requires you to input your specific local BAH rate manually.
3. Basic Allowance for Subsistence (BAS)
BAS is a non-taxable monthly allowance intended to pay for the service member's meals. Unlike Basic Pay, BAS does not increase with years of service. It is a flat rate adjusted annually based on the cost of food. For 2024, the rates are:
Enlisted: ~$460.25 per month
Officers: ~$316.98 per month
Tax Advantages
One of the hidden benefits of military pay is the tax advantage. While Basic Pay is subject to federal and state income tax, allowances like BAH and BAS are tax-exempt. This means a civilian would need to earn a significantly higher gross salary to match the take-home pay of a service member.
function calculateMilitaryPay() {
// Inputs
var grade = document.getElementById('payGrade').value;
var years = parseFloat(document.getElementById('yearsService').value);
var bah = parseFloat(document.getElementById('bahInput').value);
var includeBas = document.getElementById('includeBas').checked;
// Validation
if (isNaN(years) || years < 0) years = 0;
if (isNaN(bah) || bah < 0) bah = 0;
// 2024 Basic Pay Logic (Simplified but accurate lookup based on 2024 Tables)
// Data structure: Base Pay for [0, 2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26+] years
// We will calculate exact base pay based on brackets.
var basePay = 0;
// Helper to get pay from simplified breakpoints
// Note: These are exact 2024 Monthly Basic Pay figures
var getPay = function(g, y) {
var p = 0;
switch(g) {
// ENLISTED
case 'E-1': p = (y < 0.33) ? 1917.60 : 2017.20; break; // 4 months
case 'E-2': p = 2261.10; break;
case 'E-3': p = (y < 2) ? 2377.50 : (y < 3) ? 2526.90 : 2669.10; break;
case 'E-4':
if (y < 2) p = 2633.70;
else if (y < 3) p = 2768.70;
else if (y < 4) p = 2916.60;
else if (y < 6) p = 3066.00;
else p = 3197.40;
break;
case 'E-5':
if (y < 2) p = 2872.20;
else if (y < 3) p = 3066.30;
else if (y < 4) p = 3210.90;
else if (y < 6) p = 3365.70;
else if (y < 8) p = 3598.20;
else if (y < 10) p = 3804.00;
else if (y < 12) p = 3825.90;
else p = 3825.90; // Caps
break;
case 'E-6':
if (y < 2) p = 3135.60;
else if (y < 3) p = 3445.80;
else if (y < 4) p = 3599.40;
else if (y < 6) p = 3750.00;
else if (y < 8) p = 3908.40;
else if (y < 10) p = 4224.60;
else if (y < 12) p = 4484.40;
else if (y < 14) p = 4741.20;
else if (y < 16) p = 4806.90;
else if (y < 18) p = 4866.60;
else p = 4866.60;
break;
case 'E-7':
if (y < 2) p = 3624.90;
else if (y < 3) p = 3945.30;
else if (y < 4) p = 4096.80;
else if (y < 6) p = 4293.90;
else if (y < 8) p = 4545.90;
else if (y < 10) p = 4694.40;
else if (y < 12) p = 4961.40;
else if (y < 14) p = 5183.10;
else if (y < 16) p = 5334.30;
else if (y < 18) p = 5493.30;
else if (y < 20) p = 5565.30;
else if (y < 22) p = 5742.90;
else if (y < 24) p = 5859.30;
else if (y < 26) p = 6265.50;
else p = 6265.50;
break;
case 'E-8':
if (y < 8) p = 4969.80; // Not eligible typically before this but for calc safety
else if (y < 10) p = 5194.50;
else if (y < 12) p = 5345.10;
else if (y < 14) p = 5515.20;
else if (y < 16) p = 5698.80;
else if (y < 18) p = 5998.80;
else if (y < 20) p = 6169.50;
else if (y < 22) p = 6433.80;
else if (y < 24) p = 6586.20;
else if (y < 26) p = 7013.70;
else if (y < 30) p = 7149.90;
else p = 7291.50;
break;
case 'E-9':
if (y < 10) p = 6370.50;
else if (y < 12) p = 6505.20;
else if (y < 14) p = 6675.90;
else if (y < 16) p = 6878.40;
else if (y < 18) p = 7082.70;
else if (y < 20) p = 7414.20;
else if (y < 22) p = 7701.30;
else if (y < 24) p = 7998.60;
else if (y < 26) p = 8443.20;
else if (y < 30) p = 8891.70;
else if (y < 34) p = 9069.30;
else if (y < 38) p = 9477.90;
else p = 9477.90;
break;
// WARRANT OFFICERS
case 'W-1':
if(y<2) p=3739.80; else if(y<3) p=4116.30; else if(y<4) p=4209.60; else if(y<6) p=4417.80;
else if(y<8) p=4668.30; else if(y<10) p=4835.10; else if(y<12) p=5045.10; else if(y<14) p=5273.10;
else if(y<16) p=5454.30; else if(y<18) p=5628.90; else if(y<20) p=5831.70; else p=6209.70;
break;
case 'W-2':
if(y<2) p=4267.50; else if(y<3) p=4632.90; else if(y<4) p=4742.10; else if(y<6) p=4826.40;
else if(y<8) p=5075.10; else if(y<10) p=5423.70; else if(y<12) p=5610.60; else if(y<14) p=5839.20;
else if(y<16) p=6019.50; else if(y<18) p=6184.20; else if(y<20) p=6384.60; else if(y<22) p=6520.20;
else if(y<24) p=6618.30; else p=6729.90;
break;
// Simplified O-Rank logic for demo (O-1 to O-6)
case 'O-1':
p = (y < 2) ? 3826.20 : (y < 3) ? 3982.50 : 4814.70;
break;
case 'O-1E':
p = (y < 4) ? 4814.70 : (y < 6) ? 5116.50 : (y < 8) ? 5291.70 : (y < 10) ? 5472.00 : (y < 12) ? 5652.30 : 5877.00;
break;
case 'O-2':
p = (y < 2) ? 4408.50 : (y < 3) ? 5019.60 : (y < 4) ? 5710.20 : 5876.40;
break;
case 'O-2E':
p = (y < 4) ? 5876.40 : (y < 6) ? 6006.30 : (y < 8) ? 6174.90 : (y < 10) ? 6463.50 : (y < 12) ? 6696.00 : 6876.30;
break;
case 'O-3':
if(y<2) p=5102.10; else if(y<3) p=5783.10; else if(y<4) p=6188.40; else if(y<6) p=6687.90;
else if(y<8) p=7039.50; else if(y<10) p=7215.30; else if(y<12) p=7567.80; else if(y<14) p=7746.00; else p=7746.00;
break;
case 'O-3E':
if(y<4) p=6687.90; else if(y<6) p=7039.50; else if(y<8) p=7215.30; else if(y<10) p=7567.80; else if(y<12) p=7896.60; else if(y<14) p=8187.30; else p=8187.30;
break;
case 'O-4':
if(y<2) p=5803.20; else if(y<3) p=6681.30; else if(y<4) p=7086.00; else if(y<6) p=7176.60;
else if(y<8) p=7545.90; else if(y<10) p=8038.50; else if(y<12) p=8428.50; else if(y<14) p=8700.30;
else if(y<16) p=8858.70; else if(y<18) p=8948.40; else p=8948.40;
break;
case 'O-5':
if(y<2) p=6726.00; else if(y<3) p=7458.00; else if(y<4) p=7929.30; else if(y<6) p=8019.90;
else if(y<8) p=8313.30; else if(y<10) p=8693.40; else if(y<12) p=8975.40; else if(y<14) p=9333.90;
else if(y<16) p=9850.50; else if(y<18) p=10118.40; else if(y<20) p=10373.10; else p=10688.10;
break;
case 'O-6':
if(y<2) p=8067.90; else if(y<4) p=8857.50; else if(y<6) p=8857.50; else if(y<8) p=8894.10;
else if(y<10) p=8939.70; else if(y<12) p=8939.70; else if(y<14) p=9445.80; else if(y<16) p=10332.60;
else if(y<18) p=10860.90; else if(y<20) p=11389.20; else if(y<22) p=11690.40; else p=12020.10;
break;
default: p = 0;
}
return p;
};
basePay = getPay(grade, years);
// BAS Logic
// Enlisted: 460.25, Officer: 316.98
var bas = 0;
if (includeBas) {
if (grade.startsWith('E')) {
bas = 460.25;
} else {
bas = 316.98; // Officers and Warrants
}
}
// Totals
var totalMonthly = basePay + bas + bah;
var totalAnnual = totalMonthly * 12;
// Display Results
document.getElementById('resBasicPay').innerText = '$' + basePay.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resBas').innerText = '$' + bas.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resBah').innerText = '$' + bah.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resTotalMonthly').innerText = '$' + totalMonthly.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resTotalAnnual').innerText = '$' + totalAnnual.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2});
// Show results container
document.getElementById('results').style.display = 'block';
}