我想通过使用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
型
阅读整数或字符串工作正常。如何正确读取浮点值?
2条答案
按热度按时间ilmyapht1#
“float”具有非常低的精度。永远不要使用float,而是使用double。(总有一天你会知道你可以在哪里违背这个建议。在此之前,使用double)。结果不会是86700.2,但非常接近。
奇怪的是,你的库返回一个字符串,而值显然不是字符串。我会查看文档了解应该调用什么函数。你永远不应该像这样自己转换数据。
fkaflof62#
根据nlohmann图书馆的官方文档,这是图书馆的固有属性:
浮点数被舍入到最接近的双精度数,并使用最短的表示形式进行序列化,以允许往返
用引号更容易理解。
字符串
所以简而言之,浮点数/双精度数被舍入到数据类型中可能的最大位数。
除了将您的数据类型更改为
std::string
或移动到另一个(上述)替代方案之外,没有其他解决方案。