INTRATE
Quirk foundCategory: Financial · Last tested 2026-09-01
Real compatibility results for the INTRATE function: executed in Excel for the web, Google Sheets and LibreOffice Calc, with desktop Excel behavior from Microsoft’s official documentation (we do not run desktop Excel — Excel for the web is a different application and is executed separately). Syntax and links to that documentation are below.
Support matrix
| Engine | Documented | Live-tested | Verdict |
|---|---|---|---|
| Excel (desktop) | Yes | No — documented only | n/a |
| Excel for the web | — | Yes (recalc, 2026-09-01) | Supported, behaves as documented |
| Google Sheets | Yes | Yes (Drive import, 2026-08-31) | Supported, behaves as documented |
| LibreOffice Calc | Yes | Yes (25.8.7.3, 2026-08-31) | Quirk found |
LibreOffice version history
We executed the same test cases under each LibreOffice release to show exactly when INTRATE’s support changed — not documentation claims, real results.
| LibreOffice version | Verdict | Tested |
|---|---|---|
| 24.2.0.3 | Quirk found | 2026-08-31 |
| 24.8.7.2 | Quirk found | 2026-08-31 |
| 25.2.0.3 | Quirk found | 2026-08-31 |
| 25.8.7.3 | Quirk found | 2026-08-31 |
Why isn't INTRATE working in LibreOffice?
INTRATE exists in LibreOffice 25.8.7.3, but it is not a drop-in match for
Excel — our executed tests found real behavioral differences (detailed in the test results on this
page). If a formula that works in Excel or Google Sheets misbehaves in LibreOffice, compare your usage
against the failing cases above before assuming your data is wrong.
Discovered quirks
-
=ROUND(INTRATE(A2,A3,A4,A5,0),10) on
LibreOffice Calc returned
0.0583280899, but the documented/expected
result is 0.05768.
Provenance
The basis table documents 0 as "US (NASD) 30/360", and this is the basis a user gets by omitting the argument. Derived exactly: under 30/360 the days from 2008-02-15 to 2008-05-15 are (5-2) x 30 + (15-15) = 90 -- the same 90 as the actual count, because the two dates share a day-of-month and neither is the 31st -- and B = 360. So the rate is again 0.01442 x 360/90 = 0.05768, identical to Microsoft's published basis-2 figure. The case exists precisely because the answer is forced to agree with the published one: an engine that gets basis 2 right and basis 0 wrong has a day-count bug and nothing else can explain it. LibreOffice's own DAYS360 agrees, returning 90 for these two dates on all four builds, and its YEARFRAC(...,0) returns 0.25.; MISMATCH vs expected: expected 0.05768, got 0.0583280899
-
=ROUND(INTRATE(A2,A3,A4,A5),10) on
LibreOffice Calc returned
0.0583280899, but the documented/expected
result is 0.05768.
Provenance
The basis table's first row reads "0 or omitted | US (NASD) 30/360", so omitting the argument must give exactly the same answer as passing 0 -- and, as derived in the basis-0 case above, that answer is 0.05768, the same figure Microsoft publishes for basis 2. This is the form most real formulas take, since basis is the argument users leave off.; MISMATCH vs expected: expected 0.05768, got 0.0583280899
-
=INTRATE(A2,A3,0,A5,A6) on
LibreOffice Calc returned
#VALUE!, but the documented/expected
result is #NUM!.
Provenance
Excel documents: "If investment <= 0 or if redemption <= 0, INTRATE returns the #NUM! error value." Zero investment is also the denominator of the documented formula, so the exclusion is not arbitrary.; MISMATCH vs expected: expected '#NUM!', got '#VALUE!'
-
=INTRATE(A2,A3,A4,A5,5) on
LibreOffice Calc returned
#VALUE!, but the documented/expected
result is #NUM!.
Provenance
Excel documents: "If basis < 0 or if basis > 4, INTRATE returns the #NUM! error value." The basis table stops at 4 (European 30/360), so 5 is the first invalid value.; MISMATCH vs expected: expected '#NUM!', got '#VALUE!'
-
=INTRATE(A3,A3,A4,A5,A6) on
LibreOffice Calc returned
#VALUE!, but the documented/expected
result is #NUM!.
Provenance
Excel documents: "If settlement >= maturity, INTRATE returns the #NUM! error value." Equality is the boundary the >= sign includes, and it is also the case that would make DIM zero in the documented formula.; MISMATCH vs expected: expected '#NUM!', got '#VALUE!'
Executed test cases
Excel for the web (executed 2026-09-01 via OneDrive recalculation)
These values come from Excel for the web, not from desktop Excel. They are two different implementations of the calculation engine, and this run measured only the web one: the corpus was uploaded to OneDrive as .xlsx, recalculated by Excel for the web on open, and downloaded again for readback. Excel for the web is a rolling service with no pinnable version, so the run is identified by its date. Where a value here disagrees with the Expected column — which is Microsoft’s documentation of the desktop product — we cannot tell you whether the web engine diverges from the desktop one or the documentation is wrong about both, because we do not run desktop Excel.
| Formula | Description | Result | Expected | Verdict |
|---|---|---|---|---|
| =ROUND(INTRATE(A2,A3,A4,A5,A6),10) | Microsoft's documented worked example: $1,000,000 invested 2008-02-15, redeemed at $1,014,420 on 2008-05-15, actual/360 basis | 0.05768 | 0.05768ProvenanceMicrosoft publishes this example's result as 5.77% and spells the underlying figure out in the Description column: "Discount rate, for the terms of the bond (0.05768 or 5.77%)". Derived independently and exactly, in rational arithmetic rather than floating point. The page states the formula in full: INTRATE = ((redemption - investment) / investment) x (B / DIM), where "B = number of days in a year, depending on the year basis" and "DIM = number of days from settlement to maturity". Serial 39493 = 2008-02-15 and 39583 = 2008-05-15, so on basis 2 (actual/360) DIM is the actual day count 39583-39493 = 90 and B = 360. The rate is therefore (1014420-1000000)/1000000 x 360/90 = 0.01442 x 4 = 721/12500 = 0.05768 EXACTLY -- a terminating decimal, no rounding of any kind involved. Wrapped in ROUND(...,10) so the comparison is against a decimal figure rather than against one engine's last floating-point bit. |
Matched |
| =ROUND(INTRATE(A2,A3,A4,A5,0),10) | The same security on the DEFAULT basis 0 (US 30/360), where the day count is also 90 | 0.05768 | 0.05768ProvenanceThe basis table documents 0 as "US (NASD) 30/360", and this is the basis a user gets by omitting the argument. Derived exactly: under 30/360 the days from 2008-02-15 to 2008-05-15 are (5-2) x 30 + (15-15) = 90 -- the same 90 as the actual count, because the two dates share a day-of-month and neither is the 31st -- and B = 360. So the rate is again 0.01442 x 360/90 = 0.05768, identical to Microsoft's published basis-2 figure. The case exists precisely because the answer is forced to agree with the published one: an engine that gets basis 2 right and basis 0 wrong has a day-count bug and nothing else can explain it. LibreOffice's own DAYS360 agrees, returning 90 for these two dates on all four builds, and its YEARFRAC(...,0) returns 0.25. EXECUTED RESULT -- A SILENT WRONG ANSWER, no error: all four LibreOffice builds (24.2.0.3, 24.8.7.2, 25.2.0.3, 25.8.7.3) return 0.0583280899 here, against Microsoft's own 0.05768 for the identical security one basis over. The gap is 1.1% of the rate, and nothing in the result says so. Working backwards through the documented formula, 0.01442 x 360/DIM = 0.0583280899 puts LibreOffice's DIM at 89 rather than 90 -- it is losing one day somewhere in its 30/360 count, even though its own DAYS360 on the same two dates returns 90 on every build and its YEARFRAC(...,0) returns 0.25. The same engine returns Microsoft's 0.05768 exactly on bases 2 and 4, so this is not a rounding artefact: one day-count path out of three is wrong, and it is the DEFAULT one. |
Matched |
| =ROUND(INTRATE(A2,A3,A4,A5),10) | The optional basis argument left out entirely, which the page documents as defaulting to 0 | 0.05768 | 0.05768ProvenanceThe basis table's first row reads "0 or omitted | US (NASD) 30/360", so omitting the argument must give exactly the same answer as passing 0 -- and, as derived in the basis-0 case above, that answer is 0.05768, the same figure Microsoft publishes for basis 2. This is the form most real formulas take, since basis is the argument users leave off. EXECUTED RESULT: 0.0583280899 on all four builds -- identical to the explicit basis-0 case above, which confirms the default really is basis 0 and that the defect is in the 30/360 day count rather than in argument defaulting. It also means the wrong answer is the one a user gets by writing the shortest correct formula. |
Matched |
| =INTRATE(A2,A3,0,A5,A6) | An investment of zero, which the page excludes | #NUM! | #NUM!ProvenanceExcel documents: "If investment <= 0 or if redemption <= 0, INTRATE returns the #NUM! error value." Zero investment is also the denominator of the documented formula, so the exclusion is not arbitrary. |
Matched |
| =INTRATE(A2,A3,A4,A5,5) | A basis of 5, one past the documented range | #NUM! | #NUM!ProvenanceExcel documents: "If basis < 0 or if basis > 4, INTRATE returns the #NUM! error value." The basis table stops at 4 (European 30/360), so 5 is the first invalid value. |
Matched |
| =INTRATE(A3,A3,A4,A5,A6) | Settlement equal to maturity, which the page excludes | #NUM! | #NUM!ProvenanceExcel documents: "If settlement >= maturity, INTRATE returns the #NUM! error value." Equality is the boundary the >= sign includes, and it is also the case that would make DIM zero in the documented formula. |
Matched |
| =INTRATE("not a date",A3,A4,A5,A6) | A settlement date that is not a date at all | #VALUE! | #VALUE!ProvenanceExcel documents: "If settlement or maturity is not a valid date, INTRATE returns the #VALUE! error value." Note this branch is documented as #VALUE! while every other exclusion on the same page is #NUM! -- the page distinguishes a malformed argument from an out-of-range one, so both codes are asserted separately. |
Matched |
Google Sheets (executed 2026-08-31 via Drive import)
Google Sheets is a rolling service with no pinnable version, so this run is identified by its date. The corpus was imported to Drive as .xlsx, recalculated by Sheets, and exported back for readback.
| Formula | Description | Result | Expected | Verdict |
|---|---|---|---|---|
| =ROUND(INTRATE(A2,A3,A4,A5,A6),10) | Microsoft's documented worked example: $1,000,000 invested 2008-02-15, redeemed at $1,014,420 on 2008-05-15, actual/360 basis | 0.05768 | 0.05768ProvenanceMicrosoft publishes this example's result as 5.77% and spells the underlying figure out in the Description column: "Discount rate, for the terms of the bond (0.05768 or 5.77%)". Derived independently and exactly, in rational arithmetic rather than floating point. The page states the formula in full: INTRATE = ((redemption - investment) / investment) x (B / DIM), where "B = number of days in a year, depending on the year basis" and "DIM = number of days from settlement to maturity". Serial 39493 = 2008-02-15 and 39583 = 2008-05-15, so on basis 2 (actual/360) DIM is the actual day count 39583-39493 = 90 and B = 360. The rate is therefore (1014420-1000000)/1000000 x 360/90 = 0.01442 x 4 = 721/12500 = 0.05768 EXACTLY -- a terminating decimal, no rounding of any kind involved. Wrapped in ROUND(...,10) so the comparison is against a decimal figure rather than against one engine's last floating-point bit. |
Matched |
| =ROUND(INTRATE(A2,A3,A4,A5,0),10) | The same security on the DEFAULT basis 0 (US 30/360), where the day count is also 90 | 0.05768 | 0.05768ProvenanceThe basis table documents 0 as "US (NASD) 30/360", and this is the basis a user gets by omitting the argument. Derived exactly: under 30/360 the days from 2008-02-15 to 2008-05-15 are (5-2) x 30 + (15-15) = 90 -- the same 90 as the actual count, because the two dates share a day-of-month and neither is the 31st -- and B = 360. So the rate is again 0.01442 x 360/90 = 0.05768, identical to Microsoft's published basis-2 figure. The case exists precisely because the answer is forced to agree with the published one: an engine that gets basis 2 right and basis 0 wrong has a day-count bug and nothing else can explain it. LibreOffice's own DAYS360 agrees, returning 90 for these two dates on all four builds, and its YEARFRAC(...,0) returns 0.25. EXECUTED RESULT -- A SILENT WRONG ANSWER, no error: all four LibreOffice builds (24.2.0.3, 24.8.7.2, 25.2.0.3, 25.8.7.3) return 0.0583280899 here, against Microsoft's own 0.05768 for the identical security one basis over. The gap is 1.1% of the rate, and nothing in the result says so. Working backwards through the documented formula, 0.01442 x 360/DIM = 0.0583280899 puts LibreOffice's DIM at 89 rather than 90 -- it is losing one day somewhere in its 30/360 count, even though its own DAYS360 on the same two dates returns 90 on every build and its YEARFRAC(...,0) returns 0.25. The same engine returns Microsoft's 0.05768 exactly on bases 2 and 4, so this is not a rounding artefact: one day-count path out of three is wrong, and it is the DEFAULT one. |
Matched |
| =ROUND(INTRATE(A2,A3,A4,A5),10) | The optional basis argument left out entirely, which the page documents as defaulting to 0 | 0.05768 | 0.05768ProvenanceThe basis table's first row reads "0 or omitted | US (NASD) 30/360", so omitting the argument must give exactly the same answer as passing 0 -- and, as derived in the basis-0 case above, that answer is 0.05768, the same figure Microsoft publishes for basis 2. This is the form most real formulas take, since basis is the argument users leave off. EXECUTED RESULT: 0.0583280899 on all four builds -- identical to the explicit basis-0 case above, which confirms the default really is basis 0 and that the defect is in the 30/360 day count rather than in argument defaulting. It also means the wrong answer is the one a user gets by writing the shortest correct formula. |
Matched |
| =INTRATE(A2,A3,0,A5,A6) | An investment of zero, which the page excludes | #NUM! | #NUM!ProvenanceExcel documents: "If investment <= 0 or if redemption <= 0, INTRATE returns the #NUM! error value." Zero investment is also the denominator of the documented formula, so the exclusion is not arbitrary. |
Matched |
| =INTRATE(A2,A3,A4,A5,5) | A basis of 5, one past the documented range | #NUM! | #NUM!ProvenanceExcel documents: "If basis < 0 or if basis > 4, INTRATE returns the #NUM! error value." The basis table stops at 4 (European 30/360), so 5 is the first invalid value. |
Matched |
| =INTRATE(A3,A3,A4,A5,A6) | Settlement equal to maturity, which the page excludes | #NUM! | #NUM!ProvenanceExcel documents: "If settlement >= maturity, INTRATE returns the #NUM! error value." Equality is the boundary the >= sign includes, and it is also the case that would make DIM zero in the documented formula. |
Matched |
| =INTRATE("not a date",A3,A4,A5,A6) | A settlement date that is not a date at all | #VALUE! | #VALUE!ProvenanceExcel documents: "If settlement or maturity is not a valid date, INTRATE returns the #VALUE! error value." Note this branch is documented as #VALUE! while every other exclusion on the same page is #NUM! -- the page distinguishes a malformed argument from an out-of-range one, so both codes are asserted separately. |
Matched |
LibreOffice Calc 25.8.7.3 (tested 2026-08-31)
| Formula | Description | Result | Expected | Verdict |
|---|---|---|---|---|
| =ROUND(INTRATE(A2,A3,A4,A5,A6),10) | Microsoft's documented worked example: $1,000,000 invested 2008-02-15, redeemed at $1,014,420 on 2008-05-15, actual/360 basis | 0.05768 | 0.05768ProvenanceMicrosoft publishes this example's result as 5.77% and spells the underlying figure out in the Description column: "Discount rate, for the terms of the bond (0.05768 or 5.77%)". Derived independently and exactly, in rational arithmetic rather than floating point. The page states the formula in full: INTRATE = ((redemption - investment) / investment) x (B / DIM), where "B = number of days in a year, depending on the year basis" and "DIM = number of days from settlement to maturity". Serial 39493 = 2008-02-15 and 39583 = 2008-05-15, so on basis 2 (actual/360) DIM is the actual day count 39583-39493 = 90 and B = 360. The rate is therefore (1014420-1000000)/1000000 x 360/90 = 0.01442 x 4 = 721/12500 = 0.05768 EXACTLY -- a terminating decimal, no rounding of any kind involved. Wrapped in ROUND(...,10) so the comparison is against a decimal figure rather than against one engine's last floating-point bit. |
Matched |
| =ROUND(INTRATE(A2,A3,A4,A5,0),10) | The same security on the DEFAULT basis 0 (US 30/360), where the day count is also 90 | 0.0583280899 | 0.05768ProvenanceThe basis table documents 0 as "US (NASD) 30/360", and this is the basis a user gets by omitting the argument. Derived exactly: under 30/360 the days from 2008-02-15 to 2008-05-15 are (5-2) x 30 + (15-15) = 90 -- the same 90 as the actual count, because the two dates share a day-of-month and neither is the 31st -- and B = 360. So the rate is again 0.01442 x 360/90 = 0.05768, identical to Microsoft's published basis-2 figure. The case exists precisely because the answer is forced to agree with the published one: an engine that gets basis 2 right and basis 0 wrong has a day-count bug and nothing else can explain it. LibreOffice's own DAYS360 agrees, returning 90 for these two dates on all four builds, and its YEARFRAC(...,0) returns 0.25. EXECUTED RESULT -- A SILENT WRONG ANSWER, no error: all four LibreOffice builds (24.2.0.3, 24.8.7.2, 25.2.0.3, 25.8.7.3) return 0.0583280899 here, against Microsoft's own 0.05768 for the identical security one basis over. The gap is 1.1% of the rate, and nothing in the result says so. Working backwards through the documented formula, 0.01442 x 360/DIM = 0.0583280899 puts LibreOffice's DIM at 89 rather than 90 -- it is losing one day somewhere in its 30/360 count, even though its own DAYS360 on the same two dates returns 90 on every build and its YEARFRAC(...,0) returns 0.25. The same engine returns Microsoft's 0.05768 exactly on bases 2 and 4, so this is not a rounding artefact: one day-count path out of three is wrong, and it is the DEFAULT one. |
Mismatch |
| =ROUND(INTRATE(A2,A3,A4,A5),10) | The optional basis argument left out entirely, which the page documents as defaulting to 0 | 0.0583280899 | 0.05768ProvenanceThe basis table's first row reads "0 or omitted | US (NASD) 30/360", so omitting the argument must give exactly the same answer as passing 0 -- and, as derived in the basis-0 case above, that answer is 0.05768, the same figure Microsoft publishes for basis 2. This is the form most real formulas take, since basis is the argument users leave off. EXECUTED RESULT: 0.0583280899 on all four builds -- identical to the explicit basis-0 case above, which confirms the default really is basis 0 and that the defect is in the 30/360 day count rather than in argument defaulting. It also means the wrong answer is the one a user gets by writing the shortest correct formula. |
Mismatch |
| =INTRATE(A2,A3,0,A5,A6) | An investment of zero, which the page excludes | #VALUE! | #NUM!ProvenanceExcel documents: "If investment <= 0 or if redemption <= 0, INTRATE returns the #NUM! error value." Zero investment is also the denominator of the documented formula, so the exclusion is not arbitrary. |
Mismatch |
| =INTRATE(A2,A3,A4,A5,5) | A basis of 5, one past the documented range | #VALUE! | #NUM!ProvenanceExcel documents: "If basis < 0 or if basis > 4, INTRATE returns the #NUM! error value." The basis table stops at 4 (European 30/360), so 5 is the first invalid value. |
Mismatch |
| =INTRATE(A3,A3,A4,A5,A6) | Settlement equal to maturity, which the page excludes | #VALUE! | #NUM!ProvenanceExcel documents: "If settlement >= maturity, INTRATE returns the #NUM! error value." Equality is the boundary the >= sign includes, and it is also the case that would make DIM zero in the documented formula. |
Mismatch |
| =INTRATE("not a date",A3,A4,A5,A6) | A settlement date that is not a date at all | #VALUE! | #VALUE!ProvenanceExcel documents: "If settlement or maturity is not a valid date, INTRATE returns the #VALUE! error value." Note this branch is documented as #VALUE! while every other exclusion on the same page is #NUM! -- the page distinguishes a malformed argument from an out-of-range one, so both codes are asserted separately. |
Matched |
Docs & syntax
- Excel (desktop): official documentation
- Google Sheets: official documentation
- LibreOffice Calc: official documentation
Where INTRATE behaves differently
- Bond and treasury functions after a migration: what actually breaks
Executed across 26 fixed-income functions and 161 cases: ODDFPRICE and ODDFYIELD are literal stubs in LibreOffice, TBILLPRICE prices a two-year bill, INTRATE's default basis loses a day, and MDURATION is wrong on actual/actual. 83 of 84 documented #NUM! cases arrive as #VALUE!. Google Sheets matched 127 of 161.