C++ 如何在C++;因此,它四舍五入到小数点后6位,并有额外的';0';s或';9';修剪
如何编写一个函数,使字符串的格式为小数位数,而不尾随0或不必要的9?考虑到小数点是2,以下是我的预期: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.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);