打印双精度的整个非小数部分

Print whole non-decimal part of a double

本文关键字:小数部 双精度 打印      更新时间:2023-10-16

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

double d = 123456789;
cout << d << "n";
output: 1.23457e+08

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

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)

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

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

编辑:我将把这个留在这里以获取有关转换的信息,但正确的方法是按照其他答案中的建议使用 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;
}