diff --git a/CHANGELOG.md b/CHANGELOG.md index 696c5497dd..ca786ae44c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,7 @@ - FIXED: Segfault in `UnresolvedManeuverOverride::Turns()` on Australia extracts [#7112](https://github.com/Project-OSRM/osrm-backend/pull/7112) - CHANGED: Replaced PL:trunk with PL:expressway to match the latest changes in Polish tagging [#7079](https://github.com/Project-OSRM/osrm-backend/pull/7079) - FIXED: Remove unused C++ headers [#7105](https://github.com/Project-OSRM/osrm-backend/pull/7105) + - FIXED: Fix json rendering problem for large osm ids [#7096](https://github.com/Project-OSRM/osrm-backend/pull/7096) - Profiles: - FIXED: Bicycle and foot profiles now don't route on proposed ways [#6615](https://github.com/Project-OSRM/osrm-backend/pull/6615) - ADDED: Add optional support of cargo bike exclusion and width to bicyle profile [#7044](https://github.com/Project-OSRM/osrm-backend/pull/7044) diff --git a/include/util/json_renderer.hpp b/include/util/json_renderer.hpp index 2a6b9a90ff..501549e7e1 100644 --- a/include/util/json_renderer.hpp +++ b/include/util/json_renderer.hpp @@ -53,7 +53,7 @@ template struct Renderer // `fmt::memory_buffer` stores first 500 bytes in the object itself(i.e. on stack in this // case) and then grows using heap if needed fmt::memory_buffer buffer; - fmt::format_to(std::back_inserter(buffer), FMT_COMPILE("{:.10g}"), number.value); + fmt::format_to(std::back_inserter(buffer), FMT_COMPILE("{:.12g}"), number.value); write(buffer.data(), buffer.size()); } diff --git a/unit_tests/util/json_render.cpp b/unit_tests/util/json_render.cpp index fc830b5452..6e4126311f 100644 --- a/unit_tests/util/json_render.cpp +++ b/unit_tests/util/json_render.cpp @@ -12,9 +12,9 @@ BOOST_AUTO_TEST_CASE(number_truncating) std::string str; Renderer renderer(str); - // this number would have more than 10 decimals if not truncated + // this number would have more than 12 decimals if not truncated renderer(Number{42.9995999594999399299}); - BOOST_CHECK_EQUAL(str, "42.99959996"); + BOOST_CHECK_EQUAL(str, "42.9995999595"); } BOOST_AUTO_TEST_CASE(integer) @@ -30,7 +30,7 @@ BOOST_AUTO_TEST_CASE(test_json_issue_6531) std::string output; osrm::util::json::Renderer renderer(output); renderer(0.0000000000017114087924596788); - BOOST_CHECK_EQUAL(output, "1.711408792e-12"); + BOOST_CHECK_EQUAL(output, "1.71140879246e-12"); output.clear(); renderer(42.0); @@ -70,11 +70,11 @@ BOOST_AUTO_TEST_CASE(test_json_issue_6531) output.clear(); renderer(42.123456789); - BOOST_CHECK_EQUAL(output, "42.12345679"); + BOOST_CHECK_EQUAL(output, "42.123456789"); output.clear(); renderer(0.12345678912345); - BOOST_CHECK_EQUAL(output, "0.1234567891"); + BOOST_CHECK_EQUAL(output, "0.123456789123"); output.clear(); renderer(0.123456789); @@ -82,11 +82,16 @@ BOOST_AUTO_TEST_CASE(test_json_issue_6531) output.clear(); renderer(0.12345678916); - BOOST_CHECK_EQUAL(output, "0.1234567892"); + BOOST_CHECK_EQUAL(output, "0.12345678916"); output.clear(); - renderer(123456789123456789.); - BOOST_CHECK_EQUAL(output, "1.234567891e+17"); + renderer(12345678912345678.0); + BOOST_CHECK_EQUAL(output, "1.23456789123e+16"); + + // handle large osm ids, till 12 digits + output.clear(); + renderer(100396615812); + BOOST_CHECK_EQUAL(output, "100396615812"); } BOOST_AUTO_TEST_SUITE_END()