打印 double 的整个非小数部分

Print whole non-decimal part of a double

假设我有一个 double d = 123456789(我知道双精度数总是代表一个整数)。我正在尝试使用 C++ 打印它,以便准确打印 123456789 。不幸的是,这不是默认行为:

double d = 123456789;
cout << d << "\n";

output: 1.23457e+08

我发现了以下 trick/cheat:

double d = 123456789;
cout << (long) d << "\n";

output: 123456789

这是这样做的方法,还是有使用一些输出操纵器的更简洁的方法?

这里可以用

std::setprecision

#include <iomanip>   // std::setprecision
#include <iostream>  // std::cout

int main() {
  double d = 123456789;
  std::cout << std::setprecision(5) << d << "\n";
  // 1.2346e+08
  std::cout << std::setprecision(15) << d << "\n";
  // 123456789
}

最大精度可以用

设置
std::setprecision(std::numeric_limits<long double>::digits10 + 1)

编辑:我将在此处保留有关转换的信息,但正确的方法是按照其他答案中的建议使用 setprecision

转换为 long 没问题,只要您的值适合 long。如果您处理的值大于 long 可以表示的值,您可以升级到 long longunsigned long long。 (使用签名版本支持负值)。

请记住,double/float 可以表示非常大的值,因此最终您可能会遇到甚至不适合 unsigned long long 的值。

你可以用

之类的东西检查溢出
if (d <= (double)std::numeric_limits<long long>::max()
     && d >= (double)std::numeric_limits<long long>::min())
{
    cout << (unsigned long long) d;
}
else
{
    cout << "value d is very large: " << d;
}

您可以使用操纵器并设置输出格式,如下所示

double d = 123456789;
std::cout << std::setprecision(9) << std::noshowpoint;
std::cout << d << std::endl;