{
  "category": "Math and trigonometry functions",
  "display_name": "ISO.CEILING",
  "entry_kind": "built_in_function",
  "eval_api": {
    "method": "POST",
    "url": "https://handbook.dnacalc.com/api/eval"
  },
  "function_id": "FUNC.ISO.CEILING",
  "implementation_state": {
    "answer_bank": {
      "excel_builds": [
        "20430"
      ],
      "larger_numeric": 2,
      "last_bit": 0,
      "matched": 1323,
      "other_mismatch": 0,
      "refused": 10,
      "rows": 1335,
      "unread": 0,
      "worst_ulp": 4611686018427387904
    },
    "detail": "Of 1,339 recorded answers (1,335 in the answer bank and 4 workbook cells), 12 do not match: 2 differ by more than 16 ULP, 10 are refused.",
    "dnacalc_commit": "9e1884369a678158dd82d3d74188daf986995e87",
    "in_catalogue": true,
    "state": "differs",
    "state_label": "Known larger differences",
    "summary": "Known larger differences on 12 of 1,339 recorded answers",
    "workbook_corpus": {
      "cells": 4,
      "matched": 4
    }
  },
  "implementations": [
    {
      "commit": "9e1884369a678158dd82d3d74188daf986995e87",
      "flavour": "excel-compatibility-candidate",
      "language": "Rust",
      "name": "CalcFunc",
      "own_code": [
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/rounding_more.rs#L48-L50",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/ported/ceiling_floor_family.rs#L87-L89"
      ],
      "repository": "https://github.com/DnaCalc/DnaCalc",
      "shared_code": [
        "catalogue/rounding_more::two",
        "ported/ceiling_floor_family::excel_quotient",
        "ported/ceiling_floor_family::normalize_zero",
        "ported/ceiling_floor_family::ceiling_math_kernel"
      ],
      "source": "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/rounding_more.rs#L48-L50",
      "state": "differs",
      "suite": null,
      "summary": "Known larger differences on 12 of 1,339 recorded answers"
    }
  ],
  "json_url": "https://handbook.dnacalc.com/api/functions/FUNC.ISO.CEILING.json",
  "name": "ISO.CEILING",
  "notes": [],
  "schema": "efh.function-reference/v1",
  "section_order": [
    "what-it-does",
    "try-it",
    "quirks",
    "how-to-implement",
    "version-differences",
    "alternatives"
  ],
  "sections": {
    "alternatives": "\n### Relationships\n\n\nThis is the most crowded neighbourhood in the math category, and the differences are entirely\nabout **what happens to negatives**.\n\n- **`CEILING.PRECISE`** — documented with the same rule: absolute value\n  of significance, mathematical ceiling regardless of signs. On the documented behaviour the two\n  are the same function under two names, one carrying the ISO lineage and one the Excel-native\n  naming scheme. This page does **not** assert that they share a code path or that they agree in\n  every bit; it asserts only that the two published rules coincide.\n- **`CEILING`** — the legacy function `ISO.CEILING` was introduced to correct.\n  Its documented rule is sign-dependent, and it is the one that surprises people.\n- **`CEILING.MATH`** — the modern general form, with an explicit third\n  argument choosing the direction for negative numbers. `ISO.CEILING` is the fixed-mode case.\n- **`FLOOR.PRECISE`**, **[FLOOR.MATH](FUNC.FLOOR.MATH.md)**,\n  **`FLOOR`** — the downward mirrors, one for one.\n- **[INT](FUNC.INT.md)** — the plain floor. `ISO.CEILING(x)` and `-INT(-x)` are the same number.\n- **[MROUND](FUNC.MROUND.md)** — rounds to the *nearest* multiple rather than up.\n- All seven of the ceiling/floor surfaces are implemented in one shared module in the reference\n  engine, so they are a family by construction there as well as by documentation.\n\n\n",
    "how-to-implement": "\n### Numerical notes\n\n\nLike floor, ceiling introduces no rounding error of its own and inherits every hazard from the\ndiscontinuity. The two additions specific to the *significance* form are worth stating.\n\n**The division is where the error enters.** `⌈x/|s|⌉·|s|` performs a division, a ceiling and a\nmultiplication. Neither the division nor the multiplication is exact in general, so:\n\n1. **`x/|s|` may round to the wrong side of an integer.** If *x* is an exact multiple of *s* but\n   the quotient rounds to just above the integer, the ceiling adds a whole step and the answer is\n   one multiple too high. This is not hypothetical: it is the standard failure mode of every\n   naive round-to-multiple implementation, and it is why `ISO.CEILING(4.2, 0.1)` and its\n   relatives are the classic test cases. Decimal significances like 0.1, 0.05 and 0.01 are not\n   representable in binary64, so *every* such call is asking for the ceiling of a quotient that\n   was already inexact.\n2. **The final multiplication may not land back on a representable multiple.** `n·|s|` rounds,\n   so the returned value can fail to be exactly divisible by *s* even when *n* is correct.\n\nThe standard remedies are the ones used throughout careful decimal-rounding work: compute the\nquotient with a fused multiply-add or a double-double residual to determine the correct side of\nthe integer boundary before rounding; or scale by a power of ten and work in exact integers when\nthe significance is a decimal fraction; or apply a deliberate, documented tolerance so that a\nquotient within a few ULP of an integer is treated as on it. Each of these is a *decision*, and\nwhat matters for a compatibility implementation is which decision the target made — a question\nthis page cannot answer for Excel.\n\nFor the default significance of 1 none of this arises: the operation is IEEE 754's\n`roundToIntegralTowardPositive` (C99 `ceil`, Rust `f64::ceil`), exact for every finite double,\ncorrectly rounded by the standard, and with no intermediate at all. The gap in difficulty between\n`ISO.CEILING(x)` and `ISO.CEILING(x, 0.1)` is the whole story of this function.\n\n\n",
    "quirks": "\n### Result and edge cases\n\n\nReturns `Number`.\n\n- **Zero** returns zero, and **−1** returns −1: an argument already on a multiple is left alone.\n  Ceiling is idempotent, ⌈⌈x⌉⌉ = ⌈x⌉, and that is the visible consequence.\n- **A logical argument** and **numeric text** both convert and round. Microsoft's page addresses\n  neither.\n- **The smallest positive subnormal** rounds up to 1 — the smallest strictly positive value\n  becomes the smallest positive integer. This is correct and is the cleanest demonstration that\n  the function rounds up rather than to-nearest.\n- **The largest finite double** is returned unchanged, because every double at or above 2^52 is\n  already an integer and therefore already a multiple of 1.\n- **An inline array** produces an array of the same shape. Note that the module implementing this\n  family carries an open upstream defect stream concerning math scalar/array lifting\n  (`BUG-FUNC-017`), so array-shaped arguments in this family are an area with recorded\n  historical trouble rather than a settled one.\n- **An empty range** produces `#VALUE!`.\n\n**What is not documented, and is not invented here:** what happens when *significance* is zero.\nEvery multiple of zero is zero, so \"the least multiple of 0 that is at least x\" exists only for\nx ≤ 0. Microsoft's page does not state a rule; the neighbouring `CEILING.MATH` documentation\nstates that a zero significance yields zero, but that is a different function's page and this\npage will not transfer it. It is the first probe below.\n\n\n\n### Errors\n\n\nMicrosoft's `ISO.CEILING` page documents **no error return**. Errors reachable here come from the\nshared call model:\n\n| Error | Condition |\n|---|---|\n| `#VALUE!` | An argument does not convert to a number under the shared to-number rules |\n| propagated | An error value in either argument surfaces as that error |\n\n",
    "sources": "- Microsoft, \"ISO.CEILING function\" —\n  <https://support.microsoft.com/en-us/office/iso-ceiling-function-e587bb73-6cc2-4113-b664-ff5b09859a83>.\n  Retrieved for this page: the syntax, both argument descriptions, the default significance of 1,\n  the absolute-value remark quoted above, and the six worked examples.\n- ISO/IEC 29500 (OOXML) spreadsheet formula specification — the lineage the function's name\n  records.\n- IEEE 754-2019, `roundToIntegralTowardPositive` — the exact ceiling for the default-significance\n  case.\n- Handbook, [coercion and lifting](../model/02-coercion-and-lifting.md) — to-number outcomes,\n  lifting, error propagation.\n\n\n",
    "version-differences": "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.\n\n| Excel 16.0 build | Platform and CPU | Captured inputs |\n|---|---|---:|\n| 20430 | Windows, 64-bit, CPU not recorded | 1,335 |\n\nThe 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.\n\n[Recorded environments and comparison details](https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.ISO.CEILING.json).",
    "what-it-does": "\n`ISO.CEILING(number, [significance])` rounds *number* **upward** — toward positive infinity — to\nthe nearest multiple of *significance*.\n\n    ISO.CEILING(x, s) = ⌈ x / |s| ⌉ · |s|\n\nwith *s* defaulting to 1, in which case the function is the plain mathematical ceiling ⌈x⌉.\n\nThe defining property, and the reason the function exists, is stated on Microsoft's page:\n\n> \"The absolute value of the multiple is used, so that the ISO.CEILING function returns the\n> mathematical ceiling irrespective of the signs of number and significance.\"\n\nSo the direction of rounding is **always toward +∞**, for every combination of signs. The\ndocumented examples make the shape explicit: 4.3 rises to 5, −4.3 rises to −4, and 4.3 with a\nsignificance of either 2 or −2 gives 6, while −4.3 with either sign of 2 gives −4. Negating the\nsignificance changes nothing.\n\nCeiling is the reflection of floor: ⌈x⌉ = −⌊−x⌋, so everything true of\n[INT](FUNC.INT.md) has a mirror image here. Domain: all reals for *number*; any nonzero real for\n*significance*. Range: the multiples of |*s*|. The function is non-decreasing in *number* and\ndiscontinuous at every multiple of |*s*|, with a jump of exactly |*s*| — this time from the\n*right*, since ceiling is right-continuous where floor is left-continuous.\n\nThe name records its origin: this is the rounding rule of ISO/IEC 29500 (the OOXML spreadsheet\nformula specification), added so that a spreadsheet could express the mathematical ceiling\nwithout inheriting the sign-dependent behaviour of the older `CEILING`.\n\n\n\n### Arguments\n\n\n| Argument | Meaning | Default |\n|---|---|---|\n| `number` | \"The value to be rounded.\" Required. | — |\n| `significance` | \"The optional multiple to which number is to be rounded.\" | 1 |\n\nThe declared arity is one to two, which agrees with the documented optional second argument.\n\nBoth slots are numeric and subject to ordinary to-number coercion\n([coercion and lifting](../model/02-coercion-and-lifting.md)).\n\n\n"
  },
  "signature": {
    "display": "ISO.CEILING(number, [significance])",
    "parameters": [
      {
        "description": null,
        "name": "number",
        "optional": false,
        "repeats": false
      },
      {
        "description": null,
        "name": "significance",
        "optional": true,
        "repeats": false
      }
    ],
    "trailing_repeats": false
  },
  "sources": {
    "metadata": {
      "admission": {
        "label": "implemented",
        "reason": null
      },
      "arity": {
        "max": 2,
        "min": 1
      },
      "category": "Math and trigonometry functions",
      "classification": {
        "arg_preparation_profile": "ValuesOnlyPreAdapter",
        "coercion_lift_profile": "Custom",
        "determinism_class": "Deterministic",
        "error_collapse_profile": "None",
        "fec_dependency_profile": "None",
        "host_interaction_class": "None",
        "kernel_signature_class": "Custom",
        "rich_value_usage": "RichBlind",
        "surface_fec_dependency_profile": "RefOnly",
        "thread_safety_class": "SafePure",
        "volatility_class": "NonVolatile"
      },
      "descriptions": {
        "long": null,
        "short": "Number rounded up toward plus infinity to a multiple of the significance (ISO form)",
        "short_source": "dna-calc-own"
      },
      "docs": {
        "english_description": "Returns a number that is rounded up to the nearest integer or to the nearest multiple of significance",
        "microsoft_url": "https://support.microsoft.com/en-us/office/iso-ceiling-function-e587bb73-6cc2-4113-b664-ff5b09859a83"
      },
      "entry_kind": "built_in_function",
      "localized_family_names": null,
      "localized_names": [
        {
          "locale": "ar-SA",
          "name": "ISO.CEILING"
        },
        {
          "locale": "bg-BG",
          "name": "ISO.CEILING"
        },
        {
          "locale": "cs-CZ",
          "name": "ISO.CEILING"
        },
        {
          "locale": "da-DK",
          "name": "ISO.LOFT"
        },
        {
          "locale": "de-DE",
          "name": "ISO.CEILING"
        },
        {
          "locale": "el-GR",
          "name": "ISO.CEILING"
        },
        {
          "locale": "en-AU",
          "name": "ISO.CEILING"
        },
        {
          "locale": "en-GB",
          "name": "ISO.CEILING"
        },
        {
          "locale": "en-US",
          "name": "ISO.CEILING"
        },
        {
          "locale": "es-ES",
          "name": "MULTIPLO.SUPERIOR.ISO"
        },
        {
          "locale": "et-EE",
          "name": "ISO.CEILING"
        },
        {
          "locale": "fi-FI",
          "name": "ISO.PYÖRISTÄ.KERR.YLÖS"
        },
        {
          "locale": "fr-FR",
          "name": "ISO.PLAFOND*"
        },
        {
          "locale": "he-IL",
          "name": "ISO.CEILING"
        },
        {
          "locale": "hr-HR",
          "name": "ISO.CEILING"
        },
        {
          "locale": "hu-HU",
          "name": "ISO.PLAFON"
        },
        {
          "locale": "id-ID",
          "name": "ISO.CEILING"
        },
        {
          "locale": "it-IT",
          "name": "ISO.CEILING"
        },
        {
          "locale": "ja-JP",
          "name": "ISO.CEILING"
        },
        {
          "locale": "ko-KR",
          "name": "ISO.CEILING"
        },
        {
          "locale": "lt-LT",
          "name": "ISO.CEILING"
        },
        {
          "locale": "lv-LV",
          "name": "ISO.CEILING"
        },
        {
          "locale": "nb-NO",
          "name": "ISO.CEILING"
        },
        {
          "locale": "nl-NL",
          "name": "ISO.AFRONDEN.BOVEN"
        },
        {
          "locale": "pl-PL",
          "name": "ISO.ZAOKR.W.GÓRĘ"
        },
        {
          "locale": "pt-BR",
          "name": "ISO.CEILING"
        },
        {
          "locale": "pt-PT",
          "name": "ARRED.EXCESSO.ISO"
        },
        {
          "locale": "ro-RO",
          "name": "ISO.CEILING"
        },
        {
          "locale": "ru-RU",
          "name": "ISO.ОКРВВЕРХ"
        },
        {
          "locale": "sk-SK",
          "name": "ISO.CEILING"
        },
        {
          "locale": "sl-SI",
          "name": "ISO.CEILING"
        },
        {
          "locale": "sr-Latn-RS",
          "name": "ISO.CEILING"
        },
        {
          "locale": "sv-SE",
          "name": "ISO.RUNDA.UPP"
        },
        {
          "locale": "th-TH",
          "name": "ISO.CEILING"
        },
        {
          "locale": "tr-TR",
          "name": "ISO.TAVAN"
        },
        {
          "locale": "uk-UA",
          "name": "ISO.CEILING"
        },
        {
          "locale": "vi-VN",
          "name": "ISO.CEILING"
        },
        {
          "locale": "zh-CN",
          "name": "ISO.CEILING"
        },
        {
          "locale": "zh-HK",
          "name": "ISO.CEILING"
        },
        {
          "locale": "zh-TW",
          "name": "ISO.CEILING"
        }
      ],
      "signature": {
        "display": "ISO.CEILING(number, [significance])",
        "parameters": [
          {
            "description": null,
            "name": "number",
            "optional": false,
            "repeats": false
          },
          {
            "description": null,
            "name": "significance",
            "optional": true,
            "repeats": false
          }
        ],
        "trailing_repeats": false
      },
      "surface_name": "ISO.CEILING",
      "version_marker": null,
      "xlcall": {
        "code": "523",
        "symbol": "xlfIso_ceiling"
      }
    },
    "microsoft": "https://support.microsoft.com/en-us/office/iso-ceiling-function-e587bb73-6cc2-4113-b664-ff5b09859a83"
  },
  "try_it": {
    "formula": "=ISO.CEILING(4.2, 0.1)"
  },
  "url": "https://handbook.dnacalc.com/functions/ISO.CEILING.html",
  "variants": [],
  "versions": [
    {
      "behaviour": "1,335 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.",
      "excel_build": "16.0 build 20430",
      "platform": "Windows, 64-bit, CPU not recorded",
      "sources": [
        "https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.ISO.CEILING.json"
      ]
    }
  ]
}