打印到cout时将圆形数字舍入

时间:2013-05-25 10:54:56

标签: 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)?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

要打印浮点数,如果它们大于或等于两个可能输出的“中间”,则会向上舍入,因此-0.05会故意变为-0.0

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

您可以通过分离打印符号和浮点数的绝对值来克服这两个问题。

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

比较说明:对于等于或小于-0.05的数字,舍入abs(number)(即>= 0.05)将为非零,所以只有这样你才需要符号出现。

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

Live example

注意:floatdouble在这些方面表现完全相同。