nlohmann / json

JSON for Modern C++
https://json.nlohmann.me
MIT License
41.3k stars 6.58k forks source link

Incorrect floating point parsing #4285

Open riasat opened 5 months ago

riasat commented 5 months ago

Description

I have a sample json file which has an array of array of array of float weights. {"input_size": 3, "layer_sizes": [2, 2], "weights": [[[0.50, 0.50, 0.50], [0.30, 0.30, 0.30]],[[0.40, 0.40, 0.40], [0.20, 0.20, 0.20]]]} When I parse json the some of the floating points value show with less precision such as 0.30 is parsed as 0.299999999999

Reproduction steps

` std::ifstream file(fileName); nlohmann::json data = nlohmann::json::parse(file);

    int inputSize = data["input_size"];
    std::vector<int> layerSizes = data["layer_sizes"];
    auto weights = data["weights"];`

Expected vs. actual results

expected is to have .30 instead of parsing floating point as .29999999999.

Minimal code example

`       std::ifstream file(fileName);
        nlohmann::json data = nlohmann::json::parse(file);

        int inputSize = data["input_size"];
        std::vector<int> layerSizes = data["layer_sizes"];
        auto weights = data["weights"];`
json file:
`{"input_size": 3, "layer_sizes": [2, 2], "weights": [[[0.50, 0.50, 0.50], [0.30, 0.30, 0.30]],[[0.40, 0.40, 0.40], [0.20, 0.20, 0.20]]]}`

Error messages

No response

Compiler and operating system

VS2017

Library version

3.11.3

Validation

riasat commented 5 months ago

image

nlohmann commented 5 months ago

The number 0.3 cannot be exactly represented as double, see https://float.exposed/0x3fd3333333333333. This is independent of this library, C++, or your operating system. See https://json.nlohmann.me/features/types/number_handling for more information.