对整型变量的双精度值-意外输出

double value to int variable- unexpected output

本文关键字:意外 输出 双精度 整型变量      更新时间:2023-10-16

下面是一段简单的代码。实际上这是一个"填充数组"函数代码。

#include <iostream>
 using namespace std;
int main(){ 
   int size = 10; a[10]; numberUsed;
   cout << "Enter up to " << size << " nonnegative whole numbers.n"
   << "Mark the end of the list with a negative number.n";
   int next, index = 0;
   cin >> next;
   while ((next >= 0) && (index < size)){
      a[index] = next;
      index++;
      cin >> next;
   }
  numberUsed = index;
  for(int i = 0 ; i < numberUsed -1 ; i++){
 cout << a[i]  << endl;
  }
}

在用户输入整数时工作正常。但是当我输入双精度值时,它应该转换那个特定的值。对下一个输入的整数也重复这个值。那么现在对于输入1 2 3 4 5 6.5 7 8 9 -1,我得到以下输出123.4566666

您告诉cin读取一个整数,所以这就是它要做的-一旦它看到一个字符对整数无效,它就会停止。在这个例子中是'.'。尝试读取更多整数将继续失败,在您的情况下,将next保留在其先前的值。

如果你想截断一个浮点值,读入一个浮点变量,然后自己截断。

double next;
...
a[index] = (int) next;

当读取整数值时(并且您的代码使用int next;),任何不是整数的东西都将"停止"每次读取其他任何东西的输入。因为当它在输入流中遇到'.'时,next是6,所以它继续用该值填充数组,直到它耗尽空间。

如果你检查输入的状态,例如if(!cin >> next) ... error handling ...;,你可以检测到什么时候出了问题。作为错误处理的一部分,您应该"忽略任何输入,直到出现空格"—cin.ignore(1000, ' ');将是一个很好的开始。您还需要重置cin上的错误标志,以便下次不会得到错误,cin.clear()将这样做。

如果你想输入浮点数,你需要使用floatdouble类型的next(和数组a)。