【发布时间】:2015-07-02 04:50:26
【问题描述】:
我正在使用 jsoncpp 从 JSON 文件中读取数据。当我写回文件时,我的浮点值略有偏差。为了测试,我决定将文件解析为 Json::Value,然后将该值写回文件。我希望它看起来相同,但浮点值不同。
例子:
"Parameters":
{
"MinXValue": 0.1,
"MaxXValue": 0.15,
"MinYValue": 0.25,
"MaxYValue": 1.1,
"MinObjectSizeValue": 1
}
写成:
"Parameters":
{
"MinXValue": 0.10000000000000001,
"MaxXValue": 0.14999999999999999,
"MinYValue": 0.25,
"MaxYValue": 1.1000000238418579,
"MinObjectSizeValue": 1
}
您可能会注意到 0.25 没有变化,尽管所有其他浮点数都发生了变化。知道这里发生了什么吗?
【问题讨论】:
-
有些浮点值可以用二进制精确表示,有些则不能。您所看到的是最接近您的价值观的代表。
-
浮点数不精确。它们是有限内存中的最佳表示。 PS 0.25 是与二进制工作有关的四分之一总和;-)
-
感谢您的澄清。有没有办法避免这种情况?
-
@SFBA26 不要将浮点数写回
float。将它们写回格式化字符串。这就是为什么大多数语言都有格式化浮点数的功能,因为您不太可能希望显示或写入 18 位精度。
标签: c++ json floating-point jsoncpp