Просмотр исходного кода

Fixed incorrect rounding for float values (fixes #588)

Benoit Blanchon 8 лет назад
Родитель
Сommit
591fe7e92b
3 измененных файлов с 13 добавлено и 9 удалено
  1. 1 0
      CHANGELOG.md
  2. 8 9
      src/ArduinoJson/Serialization/FloatParts.hpp
  3. 4 0
      test/JsonWriter/writeFloat.cpp

+ 1 - 0
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
 -------

+ 8 - 9
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;

+ 4 - 0
test/JsonWriter/writeFloat.cpp

@@ -113,4 +113,8 @@ TEST_CASE("JsonWriter::writeFloat(float)") {
   SECTION("999.9") {  // issue #543
     check<float>(999.9f, "999.9");
   }
+
+  SECTION("24.3") {  // # issue #588
+    check<float>(24.3f, "24.3");
+  }
 }