使用rapidjson设置浮点精度

时间:2013-04-19 12:25:35

标签: c++ json rapidjson

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

例如:

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

这会生成如下内容:

{ length: 0.33333333 }

我发送了很多值,只需要两个小数位数就可以了。

2 个答案:

答案 0 :(得分:6)

来自消息来源

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);
}

结果:{“string”:0.32}

当然,如果您手动使用Writer,则可以使用精度参数编写函数Double

答案 1 :(得分:1)

对于遇到此情况的任何人,此方法已于 2016 年 2 月 11 日添加到 Rapidjson 中:

rapidjson::Writer::SetMaxDecimalPlaces(int maxDecimalPlaces)

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