Excel 16.0 build 20430
Windows, 64-bit, CPU not recorded
1,362 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.
Math and trigonometry functions
Refuses 12 of 1,486 recorded calls; the rest match
Of 1,486 recorded answers (1,362 in the answer bank and 124 workbook cells), 12 do not match: 12 are refused. How we measure this · See the Rust code
| Language | Name in Excel |
|---|---|
| Arabic | FLOOR.MATH |
| Bulgarian | FLOOR.MATH |
| Czech | FLOOR.MATH |
| Danish | AFRUND.BUND.MAT |
| German | FLOOR.MATH |
| Greek | FLOOR.MATH |
| English (Australia) | FLOOR.MATH |
| English (United Kingdom) | FLOOR.MATH |
| English (United States) | FLOOR.MATH |
| Spanish | MULTIPLO.INFERIOR.MAT |
| Estonian | FLOOR.MATH |
| Finnish | PYÖRISTÄ.KERR.ALAS.MATEMAATTINEN |
| French | PLANCHER.MATH |
| Hebrew | FLOOR.MATH |
| Croatian | FLOOR.MATH |
| Hungarian | PADLÓ.MAT |
| Indonesian | FLOOR.MATH |
| Italian | FLOOR.MATH |
| Japanese | FLOOR.MATH |
| Korean | FLOOR.MATH |
| Lithuanian | FLOOR.MATH |
| Latvian | FLOOR.MATH |
| Norwegian | FLOOR.MATH |
| Dutch | AFRONDEN.BENEDEN.WISK |
| Polish | ZAOKR.W.DÓŁ.MATEMATYCZNE |
| Portuguese (Brazil) | FLOOR.MATH |
| Portuguese (Portugal) | ARRED.DEFEITO.MAT |
| Romanian | FLOOR.MATH |
| Russian | ОКРВНИЗ.МАТ |
| Slovak | FLOOR.MATH |
| Slovenian | FLOOR.MATH |
| Serbian (Latin) | FLOOR.MATH |
| Swedish | RUNDA.NER.MATEMATISKT |
| Thai | FLOOR.MATH |
| Turkish | TABANAYUVARLA.MATEMATİK |
| Ukrainian | FLOOR.MATH |
| Vietnamese | FLOOR.MATH |
| Chinese (Simplified) | FLOOR.MATH |
| Chinese (Hong Kong) | FLOOR.MATH |
| Chinese (Traditional) | FLOOR.MATH |
Names from Microsoft's support site.
FLOOR.MATH(number, [significance], [mode])
FLOOR.MATH(number, [significance], [mode]) rounds number down to a multiple of
significance, with mode selecting what "down" means for negative numbers.
The mathematics is one line. For a nonzero significance s, the mathematical floor to a
multiple is
floor_to_multiple(x, s) = ABS(s) · floor( x / ABS(s) )
which is the largest multiple of ABS(s) not exceeding x. That is the toward--∞ reading,
and it is what Microsoft documents as the default: a positive number with a fractional part
loses it, and a negative number moves further from zero.
The mode argument selects the other reading for negative arguments — the toward-zero truncation:
trunc_to_multiple(x, s) = sign(x) · ABS(s) · floor( ABS(x) / ABS(s) )
The two agree on every non-negative argument and on every exact multiple. They differ only on negative arguments that are not multiples, where one gives the mathematical floor and the other gives truncation toward zero.
| Property | Statement (for the default toward--∞ reading) |
|---|---|
| Domain | all real x, all real s |
| Range | multiples of ABS(s) |
| Idempotent | applying it twice changes nothing |
| Monotone | non-decreasing in x |
| Bound | result ≤ x, with equality exactly at the multiples |
Sign of s | ignored — the absolute value of the significance is used |
| Fixed points | the multiples of ABS(s) |
Relation to INT | FLOOR.MATH(x) with default significance is INT(x) in the toward--∞ reading |
| Argument | Meaning | Default (as documented) |
|---|---|---|
number | The value to round down. Required. | — |
significance | The multiple to round to. Optional. | 1 |
mode | The direction, toward or away from zero, used for negative numbers. Optional. | see the note below |
The pinned catalogue supplies FLOOR.MATH(number, [significance], [mode]): one required argument and two optional arguments.
Returns Number.
significance omitted — documented default 1, so the function is a plain floor.significance negative — the absolute value is used; the sign of the significance does
not flip the direction. This is the design difference from the legacy FLOOR, which errors
when the two signs disagree.significance zero — not documented on this page. The mathematical expression divides by
it. FLOOR.PRECISE's page documents that a zero in either position gives zero; whether
FLOOR.MATH shares that convention is unchecked.number zero — zero is a multiple of everything, so the answer is zero.number — above 2^53 the spacing of doubles exceeds 1, so with the default
significance the function is the identity; with a small significance it still is, because no
multiple of a small s lies strictly between two adjacent doubles up there.significance — the interesting case, and the one where the answer depends on
arithmetic rather than on the rule. See the numerical notes.Microsoft's FLOOR.MATH page documents no error conditions. That is itself notable: the legacy
FLOOR documents #NUM! for mismatched signs, and FLOOR.MATH was introduced precisely to remove
that restriction. Legacy FLOOR also gives #DIV/0! for a zero significance with a nonzero number
(FN-FLOOR-001), which Microsoft's pages do not say. What a zero significance does in FLOOR.MATH
the page does not say, and it is untested.
Non-numeric arguments surface #VALUE! under the shared call model, and error values
propagate. The mechanically rendered battery beside this page shows the boundary probes.
The rule is exact arithmetic; the implementation is not, and the gap between them is this page's real content.
The naive op-graph fails, and it fails visibly. Computing s · floor(x / s) in binary64
performs two roundings around an exact operation:
x / s rounds. If the true quotient is an integer but the rounded quotient falls a hair
below it, floor drops an entire step.floor is exact — an IEEE 754 roundToIntegral operation.s · q rounds again, so the result need not be an exact multiple of s even when the
mathematics says it is.Step 1 is the damaging one, and it is not a rare edge case. Working the naive op-graph through in binary64 (this is arithmetic, not a claim about Excel):
| Input | True quotient | Computed quotient | Naive result | Mathematical answer |
|---|---|---|---|---|
x = 0.29, s = 0.01 | 29 | just below 29 | 0.28 | 0.29 |
x = 6.6, s = 1.1 | 6 | just below 6 | 5.5 | 6.6 |
x = 4.35, s = 0.05 | 87 | just below 87 | 4.3 | 4.35 |
In each row the naive route returns a value one whole step too low, because the decimal significance is not a binary64 value and the quotient of two rounded decimals lands just under the integer it should be. A user who thinks of the significance as "cents" or "tenths" sees the function skip a tread. This is the classic complaint about every floor-to-a-multiple function in every spreadsheet, and it is arithmetic rather than a defect in the rule.
What a careful implementation does about it. There is no single accepted answer, and the choice is a decision to record rather than a neutral one:
x - s·q exactly and correct q by one when the residual has the wrong sign. This makes the
result the true floor of the represented values x and s, which is the defensible
mathematical position, and it still returns 0.28 for the first row above — because
0.29/0.01 genuinely is less than 29 in the values the worksheet holds.0.29 and matches what users expect, at the cost
of no longer being a mathematical function of its inputs — there are then arguments where
FLOOR.MATH(x, s) > x.These two routes disagree on a set of inputs that is easy to enumerate, and the Handbook has not determined which one Excel takes. That is the most valuable open question on this page, because the answer changes results in the second decimal place of ordinary financial formulas, not in the last bit.
Power-of-two significances. When s is a power of two, x/s and s·q are both exact in the
naive op-graph. That does not show such a significance is safe: FLOOR's readings refute it
(FN-FLOOR-002 and FLOOR), and FLOOR.MATH itself is untested.
A note on mode and negative zero. In the toward-zero reading, a negative argument in
(-s, 0) maps to zero. Whether that zero carries a sign is not documented and is visible
through 1/FLOOR.MATH(-0.5, 1, 1).
Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.
FLOOR.MATH · 3 lines · calc-func/src/catalogue/rounding_more.rs on GitHub3 floor_math "FLOOR.MATH" (1, 3) [V "number", V "significance", V "mode"] |s, a, sv| {
three(s, a, cf::floor_math_kernel)
}
three catalogue/rounding_moreexcel_quotient ported/ceiling_floor_familynormalize_zero ported/ceiling_floor_familyfloor_math_kernel ported/ceiling_floor_familyNo implementation has been published with a Handbook test suite for this function.
The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.
| Excel 16.0 build | Platform and CPU | Captured inputs |
|---|---|---|
| 20430 | Windows, 64-bit, CPU not recorded | 1,362 |
The record contains no same-input comparison between these environments. Reading different inputs on different builds does not establish either a version change or cross-build agreement.
Recorded environments and comparison details.
Windows, 64-bit, CPU not recorded
1,362 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.
FLOOR.PRECISE — the same function without the mode argument,
documented as always returning the mathematical floor irrespective of both signs. It should
therefore equal FLOOR.MATH with mode omitted, on every input. Whether it does bitwise —
including at a zero significance, where only FLOOR.PRECISE's page documents an answer — is
the natural cross-surface probe.FLOOR — the legacy member. It rounds toward zero for negative numbers with negative
significance and errors when the signs of the two arguments differ. Replacing FLOOR with
FLOOR.MATH in an existing workbook changes results on negative arguments and removes an
error; that is a migration hazard, not a bug fix.CEILING.MATH, CEILING.PRECISE, CEILING, ISO.CEILING — the upward mirror of the
same family, sharing the implementing module. ISO.CEILING and CEILING.PRECISE are the
toward-+∞ pair.INT — INT(x) is the floor to integers, toward -∞, and coincides with
FLOOR.MATH(x) at the default significance in the default mode. TRUNC(x) is the
toward-zero reading and coincides with the other mode.MROUND — nearest multiple rather than lower multiple; it disagrees with this function
on the upper half of every step.ROUNDDOWN — toward zero to a digit position rather than to a multiple; the same
direction convention as the non-default mode, on a decimal grid.No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents