diff --git a/CHANGELOG.md b/CHANGELOG.md index 38bae762..ed515475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ HEAD ---- * Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (issue #561) +* Fixed incorrect rounding for float values (issue #588) v5.11.1 ------- diff --git a/src/ArduinoJson/Serialization/FloatParts.hpp b/src/ArduinoJson/Serialization/FloatParts.hpp index e7ca8194..fa650723 100644 --- a/src/ArduinoJson/Serialization/FloatParts.hpp +++ b/src/ArduinoJson/Serialization/FloatParts.hpp @@ -22,11 +22,18 @@ struct FloatParts { int8_t decimalPlaces; FloatParts(TFloat value) { - const uint32_t maxDecimalPart = sizeof(TFloat) >= 8 ? 1000000000 : 1000000; + uint32_t maxDecimalPart = sizeof(TFloat) >= 8 ? 1000000000 : 1000000; + decimalPlaces = sizeof(TFloat) >= 8 ? 9 : 6; exponent = normalize(value); integral = uint32_t(value); + // reduce number of decimal places by the number of integral places + for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) { + maxDecimalPart /= 10; + decimalPlaces--; + } + TFloat remainder = (value - TFloat(integral)) * TFloat(maxDecimalPart); decimal = uint32_t(remainder); @@ -44,14 +51,6 @@ struct FloatParts { } } - decimalPlaces = sizeof(TFloat) >= 8 ? 9 : 6; - - // recude number of decimal places by the number of integral places - for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) { - decimal /= 10; - decimalPlaces--; - } - // remove trailing zeros while (decimal % 10 == 0 && decimalPlaces > 0) { decimal /= 10; diff --git a/test/JsonWriter/writeFloat.cpp b/test/JsonWriter/writeFloat.cpp index a5d5ad6c..f740b329 100644 --- a/test/JsonWriter/writeFloat.cpp +++ b/test/JsonWriter/writeFloat.cpp @@ -113,4 +113,8 @@ TEST_CASE("JsonWriter::writeFloat(float)") { SECTION("999.9") { // issue #543 check(999.9f, "999.9"); } + + SECTION("24.3") { // # issue #588 + check(24.3f, "24.3"); + } }