Merge pull request #108836 from aaronfranke/json-grisu

Use num_scientific (Grisu2) when stringifying JSON with full precision
This commit is contained in:
Thaddeus Crews 2025-09-30 11:19:12 -05:00
commit e256771e86
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
3 changed files with 30 additions and 23 deletions

View file

@ -82,11 +82,18 @@ void JSON::_stringify(String &r_result, const Variant &p_var, const String &p_in
return;
}
const double magnitude = std::log10(Math::abs(num));
const int total_digits = p_full_precision ? 17 : 14;
const int precision = MAX(1, total_digits - (int)Math::floor(magnitude));
r_result += String::num(num, precision);
if (p_full_precision) {
const String num_sci = String::num_scientific(num);
if (num_sci.contains_char('.') || num_sci.contains_char('e')) {
r_result += num_sci;
} else {
r_result += num_sci + ".0";
}
} else {
const double magnitude = std::log10(Math::abs(num));
const int precision = MAX(1, 14 - (int)Math::floor(magnitude));
r_result += String::num(num, precision);
}
return;
}
case Variant::PACKED_INT32_ARRAY: