【问题标题】:objective-c round number to nearest 50Objective-c 整数到最接近的 50
【发布时间】:2010-07-19 23:29:31
【问题描述】:

如何将数字四舍五入到最接近的 X 值(例如 50)

即 47 等于 50

24 将是 0

74 等于 50

99 将是 100

等等……

我真的不知道从哪里开始研究如何做到这一点......

附言我在 iPhone 上使用 cocoa-touch

非常感谢 标记

【问题讨论】:

    标签: iphone objective-c math


    【解决方案1】:

    这样做:

    50.0 * floor((Number/50.0)+0.5)
    

    【讨论】:

    • 50 * floor((Number/50)+0.5) 可能会好一点。
    • 只有当数字为正数时才准确
    • 我正在尝试做同样的事情,但要四舍五入的数字更大。我想四舍五入到最接近的 100,000。我正在做:100000 * floor((Number/1000000)+0.5) 但我变为零了。做傻事?
    • 你需要确保你用双精度除和乘,否则你会失去精度并得到零。我刚刚注意到这个错误并修复了这个帖子。使用 100000.0 * floor((Number/1000000.0)+0.5)。那应该可以。
    【解决方案2】:

    除以 50,四舍五入到最接近的整数,然后乘以 50。

    【讨论】:

      【解决方案3】:

      所以,结合这里所说的,这里是一般功能:

      float RoundTo(float number, float to)
      {
          if (number >= 0) {
              return to * floorf(number / to + 0.5f);
          }
          else {
              return to * ceilf(number / to - 0.5f);
          }
      }
      

      【讨论】:

        【解决方案4】:

        如果数字是正数: 50 * 楼层(数字 / 50 + 0.5);

        如果数字是负数: 50 * ceil ( 数字 / 50 - 0.5 );

        【讨论】:

          【解决方案5】:

          我想提出一个不太优雅但更精确的解决方案;它仅适用于偶数目标数字。

          此示例将给定的秒数舍入到下一个完整的 60:

          int roundSeconds(int inDuration) {
          
              const int k_TargetValue = 60;
              const int k_HalfTargetValue = k_TargetValue / 2;
          
              int l_Seconds = round(inDuration);                           // [MININT .. MAXINT]
              int l_RemainingSeconds = l_Seconds % k_TargetValue;          // [-0:59 .. +0:59]
              if (ABS(l_RemainingSeconds) < k_HalfTargetValue) {           // [-0:29 .. +0:29]
                  l_Seconds -= l_RemainingSeconds;                         // --> round down
              } else if (l_RemainingSeconds < 0) {                         // [-0:59 .. -0:30]
                  l_Seconds -= (k_TargetValue - ABS(l_RemainingSeconds));  // --> round down
              } else {                                                     // [+0:30 .. +0:59]
                  l_Seconds += (k_TargetValue - l_RemainingSeconds);       // --> round up
              }
          
              return l_Seconds;
           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-18
            • 1970-01-01
            相关资源
            最近更新 更多