我有以下功能,必须将任意大小的数字转换为字符串:
string NumberToString(long long number) {
ostringstream NumberInStream;
NumberInStream.str("");
NumberInStream.clear();
NumberInStream << setprecision(0);
NumberInStream << fixed << number;
return NumberInStream.str();
}
该函数适用于maxlength的数量:9。
例如,当我输入一个10位长的数字时,例如1234567890它返回错误的格式。
一些例子:
然而,
答案 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这样的数据类型,它的精度比你开始的数字少,所以它不会失去精度。