【问题标题】:Print whole non-decimal part of a double [duplicate]打印双精度的整个非小数部分[重复]
【发布时间】:2020-05-05 05:07:00
【问题描述】:

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

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

output: 1.23457e+08

我发现了以下技巧/作弊:

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

output: 123456789

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

【问题讨论】:

标签: c++ printing output double cout


【解决方案1】:

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)

【讨论】:

  • d &gt; 1e15左右时,输出依然使用e+double 的范围通常最大为 1e308
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    编辑:我将在此处留下有关投射的信息,但正确的方法是使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2018-07-02
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多