diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2021-06-11 15:56:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-11 15:56:59 +0200 |
commit | 6107d9e180a51e3c9feb4fe8c818321c292ff86b (patch) | |
tree | b68193719f071aa98f38bb2cefc182b953b10963 /core/io/json.cpp | |
parent | e82a1113abbb72504e9b12a131738bedb40d3a28 (diff) | |
parent | 09a905ca8066c86951b23023a9e1950f277ae8f4 (diff) | |
download | redot-engine-6107d9e180a51e3c9feb4fe8c818321c292ff86b.tar.gz |
Merge pull request #34566 from Heikki00/34541_to_json_precision
Increased String::num default decimal precision
Diffstat (limited to 'core/io/json.cpp')
-rw-r--r-- | core/io/json.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/core/io/json.cpp b/core/io/json.cpp index 394cf216e8..e3e9d6158b 100644 --- a/core/io/json.cpp +++ b/core/io/json.cpp @@ -55,7 +55,7 @@ static String _make_indent(const String &p_indent, int p_size) { return indent_text; } -String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys) { +String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, bool p_full_precision) { String colon = ":"; String end_statement = ""; @@ -71,8 +71,17 @@ String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_ return p_var.operator bool() ? "true" : "false"; case Variant::INT: return itos(p_var); - case Variant::FLOAT: - return rtos(p_var); + case Variant::FLOAT: { + double num = p_var; + if (p_full_precision) { + // Store unreliable digits (17) instead of just reliable + // digits (14) so that the value can be decoded exactly. + return String::num(num, 17 - (int)floor(log10(num))); + } else { + // Store only reliable digits (14) by default. + return String::num(num, 14 - (int)floor(log10(num))); + } + } case Variant::PACKED_INT32_ARRAY: case Variant::PACKED_INT64_ARRAY: case Variant::PACKED_FLOAT32_ARRAY: @@ -121,8 +130,8 @@ String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_ } } -String JSON::print(const Variant &p_var, const String &p_indent, bool p_sort_keys) { - return _print_var(p_var, p_indent, 0, p_sort_keys); +String JSON::print(const Variant &p_var, const String &p_indent, bool p_sort_keys, bool p_full_precision) { + return _print_var(p_var, p_indent, 0, p_sort_keys, p_full_precision); } Error JSON::_get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str) { |