gpt4 book ai didi

c++ - sprintf 小数点太多/太少

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:31 67 4
gpt4 key购买 nike

我必须使用非科学(即无尾数/指数/E)字符串转换十进制数。我的代码如下所示:

/*!
\brief Converts a <em>XML Schema Decimal</em>
*/
char *ToDecimal(double val) const
{
const size_t nMax = 200;
char *doubleStr = new char[nMax];

sprintf(doubleStr, "%1.6f", val);

return doubleStr;
}

问题是,当输入 val1 时,函数返回 1.000000 但我希望得到 的输出1。另外,如果我将代码更改为 sprintf(doubleStr, "%1.0f", val); 那么它会正确输出 1,但是如果输入 val 更改为 0.000005 输出为 0,我希望输出为 0.000005。所以基本上我希望所有输出尽可能短,并删除所有不必要的 0。这可以用 sprintf 实现吗?我想通过此功能支持 3.4E +/- 38 范围。

最佳答案

事实证明,c++ iostream(具体来说,ostringstream)比 sprintf 更适合您的任务。

使用 std::fixed 操纵器禁用科学记数法。使用 std::setprecision 指定精度(小数点后的字符数)。在您的情况下,45 个位置的精度似乎足以表示所有 float 数字。

#include <sstream>
#include <string>
#include <iostream>
#include <iomanip>

std::string convert(double x)
{
std::ostringstream buffer;
buffer << std::fixed << std::setprecision(45) << x;
std::string result = buffer.str();

return result;
}

此外,要清理结果,请删除所有尾随零。

    size_t i = result.find_last_not_of('0');
if (result[i] != '.')
++i;
result.erase(i);

注意:清除尾随零仅适用于可精确表示的数字(如 0.75 或 0.03125):例如,数字 0.1 转换为 0.10000000000000000555111512312578270211815834。可以使用非常数精度(取决于数字的大小),但要做到这一点非常棘手。

相反,可以使用以下丑陋(且缓慢)的 hack:尝试将字符串的开头转换回 double,如果结果等于初始数字,则剪切字符串。

size_t i;
for (i = 1; i < result.size(); ++i)
{
std::istringstream cut(result.substr(0, i));
double temp;
cut >> temp; // the verbose syntax could fit into one line
if (temp == x) // by using boost::lexical_cast
break;
}

关于c++ - sprintf 小数点太多/太少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603003/

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