Fix parsing 0.184467440737095516159 with kParseFullPrecisionFlag

This commit is contained in:
Mikhail Khachayants 2024-12-18 00:01:27 +02:00 committed by Milo Yip
parent 58c6938b73
commit d621dc9e9c
2 changed files with 2 additions and 1 deletions

View File

@ -134,7 +134,7 @@ inline bool StrtodDiyFp(const Ch* decimals, int dLen, int dExp, double* result)
int i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999
for (; i < dLen; i++) {
if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) ||
(significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > Ch('5')))
(significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] >= Ch('5')))
break;
significand = significand * 10u + static_cast<unsigned>(decimals[i] - Ch('0'));
}

View File

@ -246,6 +246,7 @@ static void TestParseDouble() {
TEST_DOUBLE(fullPrecision, "1.00000000001e-2147483638", 0.0);
TEST_DOUBLE(fullPrecision, "0.017976931348623157e+310", 1.7976931348623157e+308); // Max double in another form
TEST_DOUBLE(fullPrecision, "128.74836467836484838364836483643636483648e-336", 0.0); // Issue #1251
TEST_DOUBLE(fullPrecision, "0.184467440737095516159", 0.184467440737095516159); // decimal part is 10 * (2^64 - 1) + 9
// Since
// abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599... x 10^-324