打印双精度的整个非小数部分
Print whole non-decimal part of a double
假设我有一个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 long
或unsigned 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;
}
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 打印双精度的整个非小数部分
- 将字符串转换为双精度,而字符串有 N 位小数,C++
- C++ std::流双精度值没有科学,也没有固定的小数计数
- 小数、双精度、整数等数据类型的范围
- 在C++中使用atof将带小数的字符串转换为双精度字符串
- 如何打印具有正确有效小数位数的C++双精度
- 使用 C++ 中的按位运算隔离双精度的小数部分
- 基元浮点和双精度支持小数位数
- 如何在Qt中打印所有小数的双精度
- 双精度不能正确减去小数
- C++ 如何获取兰登数以及如何保存带有 ONY 两位小数的双精度
- 双精度-小数位数
- 如何检查双精度数是否有小数部分
- 从二进制文件读取双精度(到类中)-小数不显示
- 将表示小数的 int 转换为双精度的正确方法是什么
- 如何砍掉双精度值的几个小数