舍入双打 - .5 - sprintf

Mei*_*eir 9 c++ printf rounding

我正在使用以下代码舍入到2dp:

sprintf(temp,"%.2f",coef[i]); //coef[i] returns a double
Run Code Online (Sandbox Code Playgroud)

它成功地将6.666舍入到6.67,但在舍入5.555时它无法正常工作.它返回5.55,而它应该(至少在我看来)返回5.56.

当下一个数字是5时,我怎样才能将它弄圆?即返回5.56.

编辑:我现在意识到这种情况正在发生,因为当我用cin输入5.555时它会被保存为5.554999997.

我将尝试分两个阶段 - 首先是3dp然后是2dp.还有其他(更优雅)的想法吗?

ypn*_*nos 11

看来你必须使用数学轮函数来进行正确的舍入.

printf("%.2f %.2f\n", 5.555, round(5.555 * 100.)/100.);
Run Code Online (Sandbox Code Playgroud)

这会在我的机器上提供以下输出:

5.55 5.56
Run Code Online (Sandbox Code Playgroud)

  • 这不是错误的,@ opnos,你还没有弄清楚浮点的限制.5.5551表示为5.555100000000000370 ...将向上舍入,5.555将被重复为5.5549999999 ...将向下舍入.您可以通过使用5.5500000000000000001尝试代码来查看它是一个表示问题 - 在这种情况下,两个输出都是不正确的5.55,因为存储时数字不是5.55000 ... 1.这是5.549999 ...... (7认同)
  • 事实上,这是一个如此亲切的赞成(因为我不能错过你的方法,整数比浮点数更容易玩). (3认同)

pax*_*blo 11

该数字5.555不能表示为IEEE754中的确切数字.打印出常量5.555,"%.50f"结果如下:

5.55499999999999971578290569595992565155029300000000
Run Code Online (Sandbox Code Playgroud)

所以它被舍去.请尝试使用此代码:

printf ("%.2f\n",x+0.0005);
Run Code Online (Sandbox Code Playgroud)

虽然你需要注意可以精确表示的数字,因为它们会被这个表达式错误地四舍五入.

您需要了解浮点表示的局限性.如果获得准确性很重要,则可以使用(或编码)没有IEEE754表示缺点的BCD或其他十进制类.