使用固定点表示法将double转换为字符串,不使用尾随零并且不使用sprintf

时间:2014-03-04 16:35:36

标签: c++ string floating-point-conversion

此问题已被问过几次,但所有答案都是指sprintf或涉及手动删除尾随零。真的没有更好的方法吗?是不是可以用std::stringstream实现这一点?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

如果目标是使尾随零点具有x或更小的固定点,则通过固定的sstream抛出双精度值。然后用非固定输出切断剩余部分。

double number = 1.03000;
std::stringstream s.precision(6);

s << number;
std::cout << s.str();

编辑: 保存结果

std::string result = s.str();