Numeric Boundary: Trailing Nines¶
A single-point GeoJSON whose coordinate decimal expansion at 15 places ends in nines. The other pattern intelliround special-cases, and the one where rounding up carries across every digit. The y value is also the case where the carry crosses an integer boundary, so a consumer rounding to 15 places returns 51.0 for a point that was never at 51.
| Property | Value |
|---|---|
| Case ID | numeric_boundary_trailing_nines |
| Category | vector |
| Format | GeoJSON |
| Geometry type | Point |
| CRS | EPSG:4326 |
| Location | 1.00°E, 51.00°N → 1.00°E, 51.00°N |
| Test tier | unit |
| Size class | tiny |
| Storage class | bundled |
| Redistributable | yes |
| Loader | geopandas |
| Status | validated |
Use this case¶
import pytest
@pytest.mark.geocase_case("numeric_boundary_trailing_nines")
def test_numeric_boundary_trailing_nines(geocase_case) -> None:
data = geocase_case.load()
assert data is not None
Use GeoCase in your tests¶
Install the complete set of vector, raster, and NetCDF dependencies:
What this case checks¶
Establish whether a text write/read cycle returns this coordinate unchanged. The expected answer ships with the case, so a consumer is graded rather than left to re-derive what "survived" means.
Risk types covered¶
Expected behavior¶
| Assertion | Expected |
|---|---|
expect_loadable |
yes |
expect_valid_geometry |
yes |
expect_crs |
yes |
expected_epsg |
4326 |
expected_geometry_types |
Point |
expected_roundtrip_coordinates |
[0.999999999999999, 51.0] |
Notes¶
The property¶
The single point in this file decimal expansion at 15 places ends in nines:
| value | shortest round-trip repr | |
|---|---|---|
| x | 0.999999999999999 |
0.999999999999999 |
| y | 51.0 |
51.0 |
One feature, one property. Plan 40's control principle: if a consumer fails this case and passes its siblings, the failure names the property.
Why this value¶
The other pattern intelliround special-cases, and the one where rounding up carries across every digit. The y value is also the case where the carry crosses an integer boundary, so a consumer rounding to 15 places returns 51.0 for a point that was never at 51.
What to assert¶
assertions.expected_roundtrip_coordinates carries the pair the file holds.
Write the case out in your own format, read it back, and compare against that
field rather than against a tolerance you chose:
import geocase
meta = geocase.get_case("numeric_boundary_trailing_nines")
expected = meta.assertions.expected_roundtrip_coordinates
A tolerance hides the failure this family exists to find -- GDAL
d6fd56f52d writes 1e-14 as 0, and every tolerance loose enough to be
"reasonable" for a coordinate near zero passes that silently.
Provenance¶
Plan 44 phase 2, from the 2026-09-06 run against GDAL d6fd56f52d. See
docs/plans/44-gdal-as-target-and-the-numeric-axis.md.
Required capabilities¶
loadgeometry-validationcoordinate-precision-check
Files¶
- Primary:
numeric_boundary_trailing_nines.geojson - Notes:
notes.md
Source and license¶
- Source: geocase-synthetic
- License: MIT
Tags¶
geojson numeric_boundary precision single_variable vector
Related cases¶
- Numeric Boundary: 1e-14 --
numeric_boundary_1e14 - Numeric Boundary: Trailing Zeros --
numeric_boundary_trailing_zeros - Numeric Boundary: 15 Significant Digits --
numeric_boundary_15_significant_digits - Numeric Boundary: 17 Significant Digits --
numeric_boundary_17_significant_digits - Numeric Boundary: 1e-13 --
numeric_boundary_1e13