【问题标题】:Set floating point precision using rapidjson使用 rapidjson 设置浮点精度
【发布时间】:2013-04-19 12:25:35
【问题描述】:

有没有办法控制使用 rapidjson 生成的 JSON 的输出精度?

例如:

writer.String("length");
writer.Double(1.0 / 3.0);

这会产生类似的东西:

{ length: 0.33333333 }

我要发送很多值,而几个值只需要两位小数。

【问题讨论】:

  • 看来这是不可能的。我已经为此功能打开了feature request

标签: c++ json rapidjson


【解决方案1】:

来源

Writer& Double(double d)
{ 
   Prefix(kNumberType);
   WriteDouble(d);
   return *this; 
}

//! \todo Optimization with custom double-to-string converter.
void WriteDouble(double d) {
        char buffer[100];
#if _MSC_VER
    int ret = sprintf_s(buffer, sizeof(buffer), "%g", d);
#else
    int ret = snprintf(buffer, sizeof(buffer), "%g", d);
#endif
    RAPIDJSON_ASSERT(ret >= 1);
    for (int i = 0; i < ret; i++)
         stream_.Put(buffer[i]);
}

对于g 转换样式转换为ef 将是 执行。

f: Precision 指定后面出现的最小位数 小数点字符。默认精度为6

来自here的引用

有一个变种,写新的Writer类,写自己的Double函数实现。

最后一个案例的简单例子

template<typename Stream>
class Writer : public rapidjson::Writer<Stream>
{
public:
   Writer(Stream& stream) : rapidjson::Writer<Stream>(stream)
   {
   }
   Writer& Double(double d)
   {
      this->Prefix(rapidjson::kNumberType);
      char buffer[100];
      int ret = snprintf(buffer, sizeof(buffer), "%.2f", d);
      RAPIDJSON_ASSERT(ret >= 1);
      for (int i = 0; i < ret; ++i)
         this->stream_.Put(buffer[i]);
      return *this;
   }
};

用法

int main()
{
   const std::string json =
      "{"
      "\"string\": 0.3221"
      "}";
   rapidjson::Document doc;
   doc.Parse<0>(json.c_str());

   rapidjson::FileStream fs(stdout);
   Writer<rapidjson::FileStream> writer(fs);
   doc.Accept(writer);
}

结果:{“字符串”:0.32}

当然,如果你手动使用Writer,你可以编写函数Double,带有精度参数。

【讨论】:

  • 谢谢。看起来这在本地是不可能的。不过,我很高兴在他们的 API 中添加一个重载,因此会根据您的建议制作一个。
【解决方案2】:

对于偶然发现此案例的任何人,此方法已于 2016 年 2 月 11 日添加到 rapidjson:

rapidjson::Writer::SetMaxDecimalPlaces(int maxDecimalPlaces)

提供的默认 Writer 类比此处的其他答案更完整,应始终使用,除非您有非常特殊的需求。

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多