Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;因此,它四舍五入到小数点后6位,并有额外的';0';s或';9';修剪_C++_String_Formatting_String Formatting - Fatal编程技术网

C++ 如何在C++;因此,它四舍五入到小数点后6位,并有额外的';0';s或';9';修剪

C++ 如何在C++;因此,它四舍五入到小数点后6位,并有额外的';0';s或';9';修剪,c++,string,formatting,string-formatting,C++,String,Formatting,String Formatting,如何编写一个函数,使字符串的格式为小数位数,而不尾随0或不必要的9?考虑到小数点是2,以下是我的预期: 0.999 -> 1.0 0.99 -> 0.99 1.01 -> 1.01 1.001 -> 1.0 123 -> 123.0 0 -> 0.0 0.1 -> 0.1 (如你所料,是否定的) 这是我到目前为止得到的,但它是相当丑陋的代码。有更好的方法吗 string toStrMaxDecimals(double value, uint decim

如何编写一个函数,使字符串的格式为小数位数,而不尾随0或不必要的9?考虑到小数点是2,以下是我的预期:

0.999 -> 1.0
0.99 -> 0.99
1.01 -> 1.01
1.001 -> 1.0
123 -> 123.0
0 -> 0.0
0.1 -> 0.1
(如你所料,是否定的)

这是我到目前为止得到的,但它是相当丑陋的代码。有更好的方法吗

string toStrMaxDecimals(double value, uint decimals) {
    value *= pow(10, decimals);
    value = round(value);
    value *= pow(0.1, decimals);
    string temp = boost::lexical_cast<string>(value); 
    size_t dot = temp.find('.');
    if (dot != string::npos) {
        if (temp.size() > dot + decimals + 1)
            temp.erase(dot + decimals + 1);
        if (*temp.rbegin() == '0')
            temp.erase(temp.find_last_not_of("0") + 1);
        if (*temp.rbegin() == '.')
            temp.append("0");
    } else {
        temp.append(".0");
    }
    return temp;
}
字符串toStrMaxDecimals(双值,uint小数){
值*=功率(10,小数);
数值=四舍五入(数值);
值*=功率(0.1,小数);
字符串temp=boost::词法转换(值);
尺寸=温度查找('.');
if(点!=string::npos){
如果(温度大小()>点+小数+1)
温度擦除(点+小数+1);
如果(*temp.rbegin()=“0”)
临时擦除(临时查找最后一个非(“0”)+1);
如果(*temp.rbegin()=='。)
临时附加(“0”);
}否则{
临时附加(“.0”);
}
返回温度;
}

您是否考虑过使用普通的sprintf进行格式化

它不能完全满足您的需要,但是如果您四舍五入到百分之一,然后将数字冲刺为%f(表示浮点)或%lf(表示双浮点)。

要想达到百分之一百,你可以做
num=num+((int)(num-((int)num))*100)/100

std::字符串toStrMaxDecimals(双值,整数小数)
{
std::ostringstream ss;

SsStfF将比C++流更容易,更可读,更性能。你不需要做任何舍入或修剪。SavaTFF有这样的标志。你可能想要一些类似

的东西。
sprintf(targetBuffer, "%.2g", floatingPointValue);

SaveTFF在java中进行舍入,我确信它也将在C++中使用。 编辑:

很抱歉,我编写的示例代码是针对您的示例的。对于原始问题,请将%.2g更改为%.6g

编辑:


将f更改为g以抑制尾随的零。

谢谢您的回答,但我想生成我得到的输出,我认为它可读性很好。(比0.7中的用户类型好得多,得到了0.70000000003或更多。)浏览SO之后,我发现find_last_not_of,这非常有用,所以我想知道是否有人还有其他字符串技巧。(同样,转换为int也会破坏使用双精度数字的目的)这太棒了!如果明天没有人能做得更好,我会接受的。我知道做得更好是可能的。谢谢。我测试了这个,结果很接近:0.1得到0.10。所以,我把你的解决方案和我的合并了——用ostringstream做舍入和串化,用我的代码清理结果。再次感谢。回答不错,效果很好t、 补码:不仅如此,还必须包括它才能工作。关闭,谢谢,但它喜欢2是精度的数字而不是小数。0.999->10.99->0.99 1.01->1 1.001->1 123->1.2e+02 0->0.1->0.1
sprintf(targetBuffer, "%.2g", floatingPointValue);