使用 0.5 规则舍入浮点数的方法

Posted

技术标签:

【中文标题】使用 0.5 规则舍入浮点数的方法【英文标题】:Ways to round a float number with the 0.5 rule 【发布时间】:2011-07-25 01:12:09 【问题描述】:

我无法使用常见的 0.5 规则实现浮点数的舍入。 让我们准确点......我怎么能做这样的回合:

x.x2 -> x.x x.x5 -> x.x(或者 x.x+1 也可以) x.x6 -> x.x+1

例如:

1.12 -> 1.1

1.22 -> 1.2

1.15 -> 1.1(或 1.2 也不错)

1.25 -> 1.2(或 1.3 也不错)

1.16 -> 1.2

1.26 -> 1.3

我尝试了这些方法(可能是错误的方式):

NSNumberFormatter NSDecimalNumber ...

但没有什么能给出这样的结果。我总是得到一些 x.x99999999 的结果,或者是四舍五入的结果(太高、太低,或者在四舍五入的数字应该在上面的时候出现在偶数上)。

【问题讨论】:

既然你提到了x.x99999999结果,你可以尝试使用%.1f格式化printf 迈克说了什么;听起来像是经典的“浮点数以 2 为底而不是以 10 为底”的问题。 顺便说一句,“当四舍五入的数字应该放在上面的时候,偶数”是通常的做法,这样四舍五入不会对一系列数字的平均值产生小的正向偏移. (例如,由于 x = 0.0 不四舍五入,0.0 @Mike DeSimone:没错,但据我所知,这在大型系统中并不常见。 【参考方案1】:

试试这个:

round(x * 10.0f) / 10.0f

【讨论】:

【参考方案2】:

为避免@junjanes 的好答案溢出,请仅在x 有小数部分时对其进行操作。

float round_tenth(float x) 

  const float limit = 1.0/FLT_EPSILON;
  // or limit = FLT_MAX/10.0;

  if (fabsf(x) < limit) 
    return roundf(x*10.0f)/10.0f;
  
  return x;

【讨论】:

以上是关于使用 0.5 规则舍入浮点数的方法的主要内容,如果未能解决你的问题,请参考以下文章

用 f 字符串舍入浮点数 [重复]

舍入浮点数的最短函数c ++

舍入浮点数,然后转到语言环境字符串

如何在PHP中舍入浮点数?

为什么舍入浮点数1.4999999999999999产生2?

C中的printf如何对浮点数进行舍入?