【问题标题】:Value should be rounded to nearest tenth or the nearest quarter值应四舍五入到最接近的十分之一或最接近的四分之一
【发布时间】:2015-12-01 14:14:17
【问题描述】:

我需要将数字四舍五入到最接近的十分之一或最接近的四分之一。

例如:

如果值在 0.225 到 0.265 之间,则将它们四舍五入为 0.25,当它们为 从 0.265 到 0.350,它们四舍五入到 0.30。

所以我需要知道某个数字的最接近的舍入是什么,而不是舍入它。

【问题讨论】:

  • @EricD。不幸的是,这个解决方案不处理最接近四分之一四舍五入的条件。
  • 第一个范围 (0.25-0.025..0.25 + 0.015),第二个 (0.3-0.035..0.3+0.05)。这种四舍五入的规律是什么?
  • 它应该将值四舍五入到最接近的十分之一或最接近的四分之一。例如 (x.00-x.05) = x.00 (x.265-x.350) = x.30 (x.730-x.765) = x.75

标签: ios swift math swift2


【解决方案1】:

您可以使用switch 语句。

主要功能:

func differentRounding(value:Double) -> Double {

    var decimalValue = value % 1
    let intValue = value - decimalValue

    switch decimalValue {
    case 0.225..<0.265 :
        decimalValue = 0.25
    case 0.725..<0.765 :
        decimalValue = 0.75
    default :
        decimalValue = ((decimalValue * 10).roundDownTillFive()) / 10
    }

    return decimalValue + intValue
}

differentRounding(1.2434534545) // 1.25
differentRounding(3.225345346) // 2.25
differentRounding(0.2653453645) // 0.3
differentRounding(0.05) // 0
differentRounding(0.04456456) // 0

四舍五入到5 分机:

extension Double {
    func roundDownTillFive() -> Double {

        var decimalValue = self % 1
        let intValue = self - decimalValue

        switch decimalValue {
        case 0.0...0.5 :
            decimalValue = 0.0
        case 0.5...1.0 :
            decimalValue = 1.0
        default :
            break
        }

        return decimalValue + intValue
    }
}

Double(0.5).roundDownTillFive() // 0
Double(0.50000001).roundDownTillFive() // 1

【讨论】:

  • 感谢这个想法,但在我的情况下,案件数量不受限制,这种情况不适合。但是谢谢你的想法!
  • @OlegGordiichuk 怎么无限?
  • @OlegGordiichuk 您的案件如何不受限制?在 0 和 1 之间只有有限数量的这些范围。请注意初始“值 %1”
  • @RobNapier 对不起,我刚刚意识到条件,你是对的。感谢您的帮助。
  • 嗯,但是这个代码示例应该被编辑,因为 (x.00-x.05) = x.00 @RMenke。尝试设置 0.05。
【解决方案2】:
import Foundation

func specround(d: Double)->Double {
    let d1 = round(d * 10) / 10
    let d2 = round(d * 4 ) / 4

    return abs(d2-d) < abs(d1-d) ? d2 : d1
}

specround(1.2249999) // 1.2
specround(1.225)     // 1.25
specround(1.276)     // 1.3

【讨论】:

    【解决方案3】:

    这是对双精度数的扩展,可以四舍五入到最接近的双精度数,对等于输入除以 2 的任何值进行四舍五入。

    extension Double {
        func roundToNearestValue(value: Double) -> Double {
            let remainder = self % value
            let shouldRoundUp = remainder >= value/2 ? true : false
            let multiple = floor(self / value)
            let returnValue = !shouldRoundUp ? value * multiple : value * multiple + value
            return returnValue
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多