圆形正值半到2位小数

Tru*_*wan 6 c number-formatting output-formatting

通常,舍入到小数点后2位非常容易

printf("%.2lf",<variable>);
Run Code Online (Sandbox Code Playgroud)

但是,舍入系统通常会舍入到最近的偶数.例如,

2.554 -> 2.55
2.555 -> 2.56
2.565 -> 2.56
2.566 -> 2.57
Run Code Online (Sandbox Code Playgroud)

而我想要实现的是

2.555 -> 2.56
2.565 -> 2.57
Run Code Online (Sandbox Code Playgroud)

事实上,四舍五入在C中是可行的,但仅对于整数;

int a = (int)(b+0.5)
Run Code Online (Sandbox Code Playgroud)

所以,我要问的是如何在正值上用2位小数而不是Integer做同样的事情来实现我之前说的打印.

chu*_*ica 1

[编辑] OP 澄清,只有打印值需要四舍五入到小数点后两位。

\n\n

OP 的观察结果是,每次“舍入到偶数”或“远离零”对数字进行“半舍入”是具有误导性的。在 100 个“中间”数字(如 0.005、0.015、0.025、...0.995)中,通常只有 4 个完全是“中间”:0.125、0.375、0.625、0.875。这是因为浮点数格式使用以 2 为基数,无法准确表示 2.565 这样的数字。

\n\n

相反,样本数字2.565具有与假设的最接近的doublebin64。将该数字四舍五入到最接近的 0.01 应为 2.56,而不是 OP 所需的 2.57。2.564999999999999947...

\n\n

因此,只有以 0.125 和 0.625 结尾的数字正好位于中间并向下舍入,而不是按照 OP 的要求向上舍入。建议接受并使用:

\n\n
printf("%.2lf",variable);  // This should be sufficient\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了接近 OP 的目标,可以对数字进行 A) 测试以 0.125 或 0.625 结尾,或 B) 略有增加。最小的增量是

\n\n
#include <math.h>\nprintf("%.2f", nextafter(x, 2*x));\n
Run Code Online (Sandbox Code Playgroud)\n\n

@Clifford 发现了另一种微移方法。

\n\n
\n\n

[之前的答案将 a 四舍五入double到最接近double的 0.01 倍数]

\n\n

典型的浮点使用诸如使用以 2 为基数的binary64等格式。“四舍五入到最接近的数学 0.01 并远离 0.0”具有挑战性。

\n\n

正如 @Pascal Cuoq 提到的,浮点数2.555通常只是接近2.555并且具有更精确的值,例如不是2.555000000000000159872...一半。

\n\n

@BLUEPIXY 下面的解决方案是最好且实用的。

\n\n
x = round(100.0*x)/100.0;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

“舍入函数将其参数舍入为浮点格式的最接近的整数值,将中间情况舍入到远离零的位置,无论当前舍入方向如何。” C11dr \xc2\xa77.12.9.6。

\n
\n\n

((int)(100 * (x + 0.005)) / 100.0)方法有两个问题:对于负数(OP 未指定),它可能会以错误的方向舍入,并且整数的范围通常要小得多(INT_MININT_MAXdouble

\n\n
\n\n

仍然有一些情况,当double x = atof("1.115");它最终接近 1.12 时,它确实应该是1.11因为1.115,因为 adouble确实更接近1.11而不是“中间”。

\n\n
string   x                         rounded x \n1.115 1.1149999999999999911182e+00 1.1200000000000001065814e+00\n
Run Code Online (Sandbox Code Playgroud)\n\n

OP 没有指定负数的舍入,假设y = -f(-x)

\n