【问题标题】:Ways to round a float number with the 0.5 rule使用 0.5 规则舍入浮点数的方法
【发布时间】: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:没错,但据我所知,这在大型系统中并不常见。

标签: objective-c c floating-point rounding


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多