gpt4 book ai didi

c++ - 使用 rapidjson 设置浮点精度

转载 作者:太空狗 更新时间:2023-10-29 20:27:33 40 4
gpt4 key购买 nike

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

例如:

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

这会生成如下内容:

{ length: 0.33333333 }

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

最佳答案

来源

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

For the g conversion style conversion with style e or f will be performed.

f: Precision specifies the minimum number of digits to appear after the decimal point character. The default precision is 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

关于c++ - 使用 rapidjson 设置浮点精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16104558/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com