c++ - 打印到 cout 时舍入双数

标签 c++ double rounding

我只想打印小数点后的一位数字。

所以我写:

double number1 = -0.049453;
double number2 = -0.05000;

cout.setf(ios::fixed,ios::floatfield);
cout.precision(1);

cout << number1 << endl;
cout << number2 << endl;

我的输出是:

-0.0
-0.1

我希望第一行是 0.0(因为 -0.00.0)。我应该如何更改我的代码,在 -0.0 的情况下,它将打印 0.0

关于第二行,为什么不打印0.0(或-0.0)?

感谢任何帮助!

最佳答案

为了打印 float ,如果它们大于或等于两个可能输出的“中间值”,它们将被四舍五入,所以 -0.05 故意变成了 -0.0 .

如果负数向上舍入为零,则结果为负零,这也是有意为之的。内部浮点格式 (IEEE 754) 区分负零和正零 ( see this link ),C++ 输出流似乎坚持这种行为。

您可以通过分开打印 float 的符号和绝对值来解决这两个问题。

cout << (number <= -.05 ? "-" : "") << abs(number);

比较说明:对于等于或小于-0.05的数字,四舍五入abs(number)(然后是>= 0.05) 将是非零的,所以只有到那时你才希望符号出现。

请注意,此比较中的阈值取决于您选择的输出格式。因此,您应该在您的代码中尽可能将此打印方法保留在本地,您知道要打印 float 指针的确切格式。

Live example

注意:floatdouble 在这些点上的行为完全相同。

关于c++ - 打印到 cout 时舍入双数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748818/

相关文章:

c++ - 正确实现删除 vector 元素

java - 哈希表<字符串 double >

android - 如何管理在 GCM 服务器端的多播消息服务中添加注册 ID?

c# - 在 C# 中从串口接收数据有问题吗?

c++ - 这是通过网络发送序列化对象的好概念吗?

c++ - 从 FBO 渲染时纹理在表面上重复

来自mysql的PHP双数精度和

java - 高效的 BigDecimal 上下舍入到两位小数

swift - 在 Swift 中四舍五入

swift - 始终显示 $