C ++ long long to string conversion失败

时间:2017-05-16 23:58:45

标签: c++ type-conversion

我有以下功能,必须将任意大小的数字转换为字符串:

string NumberToString(long long number) {
    ostringstream NumberInStream;
    NumberInStream.str("");
    NumberInStream.clear();
    NumberInStream << setprecision(0);
    NumberInStream << fixed << number;
    return NumberInStream.str();
    }

该函数适用于maxlength的数量:9。

例如,当我输入一个10位长的数字时,例如1234567890它返回错误的格式。

一些例子:

  • 1494978929成为1494978944
  • 1494979474成为1494979456
  • 1494979487成为1494979456
  • 1494979498成为1494979456
  • 1494979500成为1494979456
  • 1494979529成为1494979584
  • 1494979540成为1494979584

然而,

  • 2变为2
  • 120变为120
  • 44567成为44567
  • 由于setprecision(0),
  • 456.45变为456

3 个答案:

答案 0 :(得分:4)

欢迎使用浮点精度。相反,在函数原型中使用double尝试使用相同的脚本,您将看到获得所需的结果。但是,如果输入一定长度的整数,则会失败。

只看这个输出。

printf ("%f\n", 1494978929.f)

并且您将看到您不能将该int表示为具有总精度的浮点数。最后使用.0而不是.f拨打相同的电话,您会看到不同的结果。

答案 1 :(得分:2)

这是IEEE浮点表示法的一个问题:https://en.wikipedia.org/wiki/IEEE_floating_point。你的问题说你在很长的时间内进行转换,但是你的函数以浮动为参数。浮点数以32位存储在内存中。根据实现,比特被分成三组:一个比特用于确定符号,然后多个比特用于有效数字(c),其余比特是商(q) 。根据设置的位数,使用此表示法确定的数字是(-1)^ s * c * b ^ q其中b是基数(通常为2或10)。如何表示所有这些取决于您的编译器和ISO标准。这意味着IEEE浮点代表的数字必须符合这个功能。基本上,您希望表示的所有相对较小的整数都可以使用此公式,但是当您尝试表示非常小或非常大的数字时,IEEE浮点数将会崩溃。在您的情况下,一些超过10位的数字字符串需要太多精度才能表示浮点数。我建议你使用双倍或长双,或者使用上面提到的long long而不是浮点数。

答案 2 :(得分:1)

是的,float是32位,其中一部分是指数,因此float的精度低于普通的int,但由于牺牲了指数的某些位,因此它具有很宽的表达式。

使用double,为你提供更多范围,但仍然不够长,或者将其作为模板:

template <typename T>
string NumberToString(T number) {
    ostringstream NumberInStream;
    NumberInStream.str("");
    NumberInStream.clear();
    NumberInStream << setprecision(0);
    NumberInStream << fixed << number;
    return NumberInStream.str();
}

现在可能需要进行一些调整,但由于将值传递给像float或double这样的数据类型,它的精度比你开始的数字少,所以它不会失去精度。