Comments (4)
Can you share some code which demonstrates this? doubles are generally subject to rounding errors, though if you're dealing with an integral value, and no calculations other than putting it into a Json object I wouldn't expect such a difference.
from json11.
Can't investigate without further information.
from json11.
I'm having the same problem. It can be reproduced adding the following snippet in a GoogleTest case:
string err;
DataObject obj = json11::Json::parse("{\"num\": 200.1}", err);
ASSERT_TRUE(err.empty());
ASSERT_TRUE(obj["num"].is_number());
ASSERT_EQ(200.1, obj["num"].number_value());
string out = obj.dump();
ASSERT_EQ("{\"num\": 200.1}", out);
resulting in
Value of: out
Actual: "{\"num\": 200.09999999999999}"
Expected: "{\"num\": 200.1}"
I narrowed it down to the strtod function call in "parse_number". It seems that both strtod and atof for "200.1" yield the double value 200.09999999... So essentially there is no bug in Json11, it is just a floating point precision problem.
from json11.
Yeah, I don't know what the specific details of what atof/strod might be doing, but I think this is likely an inherent problem with floating-point. Mathematically, 1/10 is not perfectly representable using powers of 2, so what we're seeing is probably slightly different rounding behaviors coming out of the implementation of strtod
on input, vs. snprintf
at output. In particular, I think difference between your "expected output" and the actual output seems to be how many digits of accuracy are requested at print time. I tried this code:
double d = 200.1;
printf("%.14lf\n", d);
and it printed "200.09999999999999", but without the ".14" it printed 200.100000, so clearly the printf family of functions are doing some rounding. Json11 requests maximal digit precision for accuracy purposes. That should mean that what you're seeing is probably a closer decimal representation of the binary floating-point number in the double, though there could be further rounding error the more conversions are done.
For any practical calculation purposes, the values should be equivalent. Json11 wasn't designed to guarantee perfect fidelity in converstions string -> Json -> string. If we wanted that we could cache the string representation of various sub-objects, in order to re-serialize them.
from json11.
Related Issues (20)
- is it possible to add fields to the json? HOT 1
- in json11.cpp line 161 , why use static_cast, what if a json object is a runtime parsed object HOT 1
- clang 6.0 compilation error HOT 2
- Check if a json object key exists HOT 2
- differentiate between "number" and "integer" as per json schema HOT 1
- Tag Versioning HOT 6
- Number size issue.
- Can't parse wstring?
- auto casting HOT 4
- has_shape() always returns true when used with json11::Json::NUL HOT 1
- [Feature] conan package manager support HOT 1
- Order serealization Json::object HOT 2
- ASAN reports runtime error HOT 1
- swig4.0.0 and mingw compile the test.cpp(main modified to be a function) :error: 'final' is not a member of 'json11' HOT 3
- can't be loaded as a dll in low version c++? HOT 2
- Warning '-Werror=overloaded-virtual' with gcc-5.1.0 --std=c++14 HOT 1
- Making object_items(), array_items() not const or alternatively support mutable_object_items() HOT 1
- Super stuff. HOT 1
- No API to add Json (f.e. array) to Json::object outside of ctor. HOT 1
- Buliding for windows? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from json11.