【问题标题】:Round up an integer to multiple of 3将整数四舍五入为 3 的倍数
【发布时间】:2015-01-26 11:40:27
【问题描述】:

我想将一个整数四舍五入到最接近的 3 的倍数。 示例:

var numberOne = 2
var numberTwo = 7
  • numberOne 向上取整等于 3
  • numberTwo 向上取整等于 9

我不想让它四舍五入。

有什么想法吗? 谢谢

【问题讨论】:

    标签: swift integer rounding


    【解决方案1】:

    我在操场上得到了这个:

    import Foundation
    
    func roundToThree(value: Int) -> Int{
        var fractionNum = Double(value) / 3.0
        let roundedNum = Int(ceil(fractionNum))
        return roundedNum * 3
    }
    
    roundToThree(2)
    roundToThree(7)
    

    【讨论】:

      【解决方案2】:

      我是这样实现的:

      func roundUp(value: Int, divisor: Int) -> Int {
          let modulo = value % divisor
          var multiplier = value / divisor
          if modulo > 0 {
              ++multiplier
          }
          return divisor * multiplier
      }
      

      函数计算:

      • 模数:除数除以值的模数
      • multiplier:值除以除数的整数
      • 如果模大于零,则乘数递增
      • 结果值是除数乘以乘数

      仅使用整数,该算法应该比其他基于浮点计算的算法更快。

      我将除数设置为参数,您可以选择将其删除并在函数体中将其替换为 3 文字,或为其分配默认值:

      func roundUp(value: Int, divisor: Int = 3) -> Int 
      

      【讨论】:

      • 有时手指过着自己的生活,在后台进行自动更正。是的,那应该是modulo,但手指更了解modules。名称已修复,谢谢!
      【解决方案3】:

      我的 2 克拉:

      func roundUp(value: Int, divisor: Int) -> Int {
          let rem = value % divisor
          return rem == 0 ? value : value + divisor - rem
      }
      

      【讨论】:

      • 最智能、最快、最简单
      【解决方案4】:

      带有可配置乘数的 swift3 Float 扩展(改编自 @erdekhayser 接受的答案)

      extension Float {
          func roundUpTo(multiplier: Int) -> Int{
              let fractionNum = self / Float(multiplier)
              return Int(ceil(fractionNum)) * multiplier
          }
      }
      

      【讨论】:

        【解决方案5】:

        这就像 Martin R 的答案,但通过四舍五入到最接近的倍数而不是四舍五入来工作

        斯威夫特 3/4

        func roundUp(value: Double, divisor: Double) -> Double {
            let rem = value.truncatingRemainder(dividingBy: divisor)
            if(rem >= divisor / 2)
            {
                return rem == 0 ? value : value + divisor - rem
            }
            else
            {
                return rem == 0 ? value : value - rem
            }
        }
        

        【讨论】:

        • Martin 的代码也四舍五入到最接近的倍数。如果将 type 更改为Int,编译器很可能会生成相同的代码。
        猜你喜欢
        • 2013-08-22
        • 2014-08-26
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多