这个问题已经被问过几次了,但所有的答案要么是指 sprintf ,要么是涉及手动删除尾随零。真的没有更好的办法吗?不可能做到这一点std::stringstream
吗?
问问题
1227 次
2 回答
4
首先,您计算小数点前后有多少位潜在数字:
int digits_before = 1 + (int)floor(log10(fabs(value)));
int digits_after = std::numeric_limits<double>::digits10 - digits_before;
然后你会发现这些数字中有多少是零:
double whole = floor(pow(10, digits_after) * fabs(value) + 0.5);
while (digits_after > 0 && (whole/10.0 - floor(whole/10.0)) < 0.05)
{
--digits_after;
whole = floor(whole / 10.0 + 0.5);
}
if (digits_after < 0) digits_after = 0;
现在你有了一个可以使用的值std::setprecision
:
std::stringstream ss;
ss << std::fixed << std::setprecision(digits_after) << value;
归根结底,这需要大量工作,并且会重复字符串转换所做的工作,这就是为什么人们通常只转换为字符串并删除尾随零的原因。不,没有简单的格式化选项可以做到这一点,你必须努力做到这一点,或者根本不这样做。
请参阅上面的代码:http: //ideone.com/HAk55Y
于 2014-03-04T17:27:07.040 回答
-1
如果目标是使x
尾随零的固定点小于或等于固定点,则通过固定的 sstream 将 double 扔掉。然后切断剩余的非固定输出。
double number = 1.03000;
std::stringstream s.precision(6);
s << number;
std::cout << s.str();
编辑:保存结果
std::string result = s.str();
于 2014-03-04T16:54:47.873 回答