json icon indicating copy to clipboard operation
json copied to clipboard

Incorrect floating point parsing

Open riasat opened this issue 1 year ago • 2 comments

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 avatar Feb 03 '24 05:02 riasat

image

riasat avatar Feb 03 '24 05:02 riasat

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.

nlohmann avatar Feb 03 '24 07:02 nlohmann