Skip to content

Commit 5b4fca7

Browse files
String: Fix a bug in calculating the number of significant digits for exact powers of 10
1 parent b95ede4 commit 5b4fca7

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

modules/juce_core/text/juce_String.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2878,6 +2878,20 @@ class StringTests final : public UnitTest
28782878
expectEquals (String::toDecimalStringWithSignificantFigures (2.8647, 6), String ("2.86470"));
28792879

28802880
expectEquals (String::toDecimalStringWithSignificantFigures (-0.0000000000019, 1), String ("-0.000000000002"));
2881+
2882+
// Powers of 10
2883+
2884+
expectEquals (String::toDecimalStringWithSignificantFigures ( 0.001, 7), String ( "0.001000000"));
2885+
expectEquals (String::toDecimalStringWithSignificantFigures ( 0.01, 7), String ( "0.01000000"));
2886+
expectEquals (String::toDecimalStringWithSignificantFigures ( 0.1, 7), String ( "0.1000000"));
2887+
expectEquals (String::toDecimalStringWithSignificantFigures ( 1, 7), String ( "1.000000"));
2888+
expectEquals (String::toDecimalStringWithSignificantFigures ( 10, 7), String ( "10.00000"));
2889+
expectEquals (String::toDecimalStringWithSignificantFigures ( 100, 7), String ( "100.0000"));
2890+
expectEquals (String::toDecimalStringWithSignificantFigures ( 1000, 7), String ( "1000.000"));
2891+
expectEquals (String::toDecimalStringWithSignificantFigures ( 10000, 7), String ( "10000.00"));
2892+
expectEquals (String::toDecimalStringWithSignificantFigures ( 100000, 7), String ( "100000.0"));
2893+
expectEquals (String::toDecimalStringWithSignificantFigures ( 1000000, 7), String ( "1000000"));
2894+
expectEquals (String::toDecimalStringWithSignificantFigures (10000000, 7), String ("10000000"));
28812895
}
28822896

28832897
beginTest ("Float trimming");

modules/juce_core/text/juce_String.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,11 +1159,10 @@ class JUCE_API String final
11591159
return "0";
11601160
}
11611161

1162-
auto numDigitsBeforePoint = (int) std::ceil (std::log10 (number < 0 ? -number : number));
1163-
1164-
auto shift = numberOfSignificantFigures - numDigitsBeforePoint;
1165-
auto factor = std::pow (10.0, shift);
1166-
auto rounded = std::round (number * factor) / factor;
1162+
const auto numDigitsBeforePoint = (int) std::floor (std::log10 (std::abs (number)) + DecimalType (1));
1163+
const auto shift = numberOfSignificantFigures - numDigitsBeforePoint;
1164+
const auto factor = std::pow (10.0, shift);
1165+
const auto rounded = std::round (number * factor) / factor;
11671166

11681167
std::stringstream ss;
11691168
ss << std::fixed << std::setprecision (std::max (shift, 0)) << rounded;

0 commit comments

Comments
 (0)