std::cin 无法正确处理大数字

std::cin not working correcly with large numbers

我发现std::cin的一个奇怪行为(在Win 10下使用VS 17):当输入一个大数字时,std::cin读取的数字接近但不同。 有没有对大数进行任何近似? 如何获得与输入完全相同的大数?

double n(0);

cout << "Enter a number > 0 (0 to exit): ";
cin.clear();                                // does not help !
cin >> n;                                   // enter 2361235441021745907775
printf("Selected number %.0f \n", n);       // 2361235441021746151424 is processed ?.

输出

Enter a number > 0 (0 to exit):
2361235441021745907775
Selected number 2361235441021746151424

您需要了解有效位数。 double 可以容纳非常大的值,但它只能处理这么多数字。搜索 C++ doubles significant digits 并阅读讨论它的 400 个网页中的任何一个。

如果您需要比这更多的数字,则需要使用除双精度以外的其他数字。如果你知道它是一个整数,而不是浮点数,你可以使用 long long int,它至少有 8 个字节并且可以容纳 2^63-1。如果你知道它是一个正数,你可以把它设为 unsigned long long int 并且你得到的范围是 0 到至少 18,446,744,073,709,551,615 (2^64-1).

如果你需要更多的数字,你需要找到一个支持任意长整数的库。 c++ arbitrary precision integer 的 google 会给你一些指导。