我是一名编程新手。我需要一个简单的函数来将任何带小数点X.YZ的数字转换为XYZ。我通过将它乘以10次并使用 double 到 int 转换来完成它。
int main()
{
std::cout << "Number: " << std::endl;
double a;
// the uninitialized b was pointed out, its not the issue
long b = 0;
std::cin >> a;
while(b!=a)
{
a*=10;
b=a;
}
std::cout << a << std::endl;
return 0;
}
这种方式在90%的情况下起作用。对于像132.54这样的一些数字,程序运行的时间非常长。它处理132.547(应该使用更多的内存,然后是132.54)。
所以我的问题是:为什么它不能100%用于long int内存范围内的数字?为什么132.54和类似的数字?
我正在使用Codeblocks和GNU GCC编译器。
答案 0 :(得分:4)
许多十进制浮点数不能用二进制精确表示。你只能得到一个接近的近似值。
如果132.54表示为132.539999999999999,则永远不会得到匹配。
在循环中打印值,您将看到会发生什么。
答案 1 :(得分:2)
您的问题是您从未初始化b
,因此未定义的行为。
你应该这样做:
long b = 0;
现在你可以将b与其他东西进行比较并获得良好的行为。
还应将float
与integral
类型进行比较,例如与适当的epsilon值进行比较:
while(fabs(an_int - a_float) < eps)
答案 2 :(得分:2)
问题是大多数十进制值不能完全表示为浮点值。因此,具有仅具有几个数字的十进制值并不能保证乘以十倍足够的时间将产生没有小数部分的浮点值。要查看此内容,请每次循环显示a
的值。低位有很多噪音。
答案 3 :(得分:1)
不是将其作为双精度读取,而是将其作为字符串读取并解析它。你不会遇到浮动精度问题。
答案 4 :(得分:0)
long b;
在这里定义 b
。从这一点来说,变量包含垃圾值。这个值可以是绝对随机的,基本上就是它在分配时在内存中发生的事情。之后,您在条件中使用此变量:
while(b!=a)
这将导致未定义的行为,这基本上意味着任何事情都可能发生,包括应用程序似乎正在工作的机会(如果幸运的话),基于垃圾值在b
。
为避免这种情况,您需要使用某个值初始化b
,例如long b = 0
。