舍入浮动值,精度为0.5

时间:2016-02-02 00:56:40

标签: c++ floating-point numbers

你如何围绕一个浮点值进行舍入,让我们说小数点后的单个数字,例如给定18.0-18.4我想显示18.0或给出18.5-19.0显示19.0等? 谢谢大家

2 个答案:

答案 0 :(得分:1)

使用@Revolver_Ocelot

评论的std::round()

使用floor(x + 0.5)的情况会失败:

  1. 负数。当然,代码可以尝试ceil(x - 0.5)

  2. 总和x+0.5可能会创建一个新整数的舍入答案:FP数小于0.5。 x的ULP(最小二进制数字)为0.5或1.0的某些值。

  3. IOWs,代码需要确保0.5添加不需要额外的精确度。

    以下是round_alt()应该round()不存在的候选人。 round_alt()没有这些问题。

    double round_alt(double x) {
      double ipart;
      // break into integer and fraction parts
      double fpart = modf(x, &ipart);
      if (fpart != 0.0) {
        if (x >= 0.5) {
          ipart += floor(fpart + 0.5);
        } else if (x <= -0.5) {
          ipart += ceil(fpart - 0.5);
        }
      }
      return ipart;
    }
    

答案 1 :(得分:0)

我会使用floor()函数。由于round()可能无法在您的编译器上实现。

#include "stdafx.h"
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{
    double input = 18.0;
    for (int i = 0; i < 10; i++, input += 0.1 )
    {
        double output = floor( input + 0.5 );
        printf( "Input:%f Output:%f\n", input, output );
    }
    getchar();

    return 0;
}

输出就是这样。

enter image description here