使用nlohmann::json从JSON解析浮点数

xmjla07d  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(442)

我想通过使用nlohmann::json库从json文件中获取一个十进制数到一个float变量中,并且总是得到输出86700.2031而不是86700.2。首先,我使用了一个数字json类型:

{
  "test": 86700.2,
}

字符串
我试过这样的方法:

using json = nlohmann::json;
std::string config_path = "C:/config/default.json";
std::ifstream config_file(config_path);
json config = json::parse(config_file);

float test = config["test"]; //Output: 86700.2031


之后,我将json类型更改为string,并尝试了相同的结果:

float test = std::stof(config["test"].get<std::string>()); //Output: 86700.2031


阅读整数或字符串工作正常。如何正确读取浮点值?

ilmyapht

ilmyapht1#

“float”具有非常低的精度。永远不要使用float,而是使用double。(总有一天你会知道你可以在哪里违背这个建议。在此之前,使用double)。结果不会是86700.2,但非常接近。
奇怪的是,你的库返回一个字符串,而值显然不是字符串。我会查看文档了解应该调用什么函数。你永远不应该像这样自己转换数据。

fkaflof6

fkaflof62#

根据nlohmann图书馆的官方文档,这是图书馆的固有属性:
浮点数被舍入到最接近的双精度数,并使用最短的表示形式进行序列化,以允许往返
用引号更容易理解。

float f = 0.3;
json j = f;
std::cout << j << '\n'; // yields 0.30000001192092896.

字符串
所以简而言之,浮点数/双精度数被舍入到数据类型中可能的最大位数。
除了将您的数据类型更改为std::string或移动到另一个(上述)替代方案之外,没有其他解决方案。

相关问题