This branch has been modified so the output matches that of nholmann/json.
We use this for serializing f64 before sending in a JSON object tospanner.
Internally spanner appears to use zetasql (https://github.com/google/zetasql) which uses nholmann/json (https://github.com/nlohmann/json/).
ZetaSQL will not accept a float in a json structure if it does not roundtrip to the same value when serialized. By serializing the floats using a grisu2 implementation equivalent to nholmann/json, we are guaranteed that the float will be accepted.
You can test this out by pulling the zetasql repo and running:
bazel run //zetasql/tools/execute_query:execute_query \
-- "select PARSE_JSON('2.250497700094831e+307');"
The tests require data generated by the nholmann/json library. To generate it:
$ git submodule init
$ git submodule update
$ c++ -I"nholmann_json/include" -std=c++17 -o gen_test_data gen_test_data.cc
$ ./gen_test_data
$ cargo test
This crate provides fast conversion of floating point primitives to decimal strings. The implementation is a straightforward Rust port of Milo Yip's C++ implementation dtoa.h. The original C++ code of each function is included in comments.
See also itoa
for printing integer primitives.
Version requirement: rustc 1.36+
[dependencies]
dtoa = "1.0"
fn main() {
let mut buffer = dtoa::Buffer::new();
let printed = buffer.format(2.71828f64);
assert_eq!(printed, "2.71828");
}
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.