diff --git a/include/util/json_renderer.hpp b/include/util/json_renderer.hpp index f397a6e4a..2a9697129 100644 --- a/include/util/json_renderer.hpp +++ b/include/util/json_renderer.hpp @@ -47,20 +47,12 @@ template struct Renderer void operator()(const Number &number) { + // we don't want to print NaN or Infinity + BOOST_ASSERT(std::isfinite(number.value)); // `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("{}"), number.value); - - // Truncate to 10 decimal places - size_t decimalpos = std::find(buffer.begin(), buffer.end(), '.') - buffer.begin(); - if (buffer.size() > (decimalpos + 10)) - { - buffer.clear(); - fmt::format_to(std::back_inserter(buffer), FMT_COMPILE("{0:.10f}"), number.value); - - // buffer.resize(decimalpos + 10); - } + fmt::format_to(std::back_inserter(buffer), FMT_COMPILE("{:.10g}"), number.value); write(buffer.data(), buffer.size()); } diff --git a/unit_tests/util/json_render.cpp b/unit_tests/util/json_render.cpp index 82052ece8..dcf0076e9 100644 --- a/unit_tests/util/json_render.cpp +++ b/unit_tests/util/json_render.cpp @@ -16,7 +16,7 @@ BOOST_AUTO_TEST_CASE(number_truncating) // this number would have more than 10 decimals if not truncated renderer(Number{42.9995999594999399299}); - BOOST_CHECK_EQUAL(str, "42.999599959"); + BOOST_CHECK_EQUAL(str, "42.99959996"); } BOOST_AUTO_TEST_CASE(integer) @@ -27,4 +27,11 @@ BOOST_AUTO_TEST_CASE(integer) BOOST_CHECK_EQUAL(str, "42"); } +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_AUTO_TEST_SUITE_END()