【问题标题】:Round Integer Numbers in SwiftSwift 中的整数整数
【发布时间】:2016-12-03 18:33:20
【问题描述】:

出于货币目的,我想将整数四舍五入到最接近的百分之一,这在 Swift 中怎么可能?

示例:1397968 变为 1397900

【问题讨论】:

  • 用另一种语言你会怎么做?你已经尝试了什么?
  • / 100 * 100足够了吗?
  • 如果这确实是您想要做的,那么 vadian 的评论就会发挥作用。我们错过了什么吗?
  • 100 的 最近的倍数是 1398000,而不是 1397900。
  • 始终使用NSDecimalNumber / Decimal 兑换货币!!

标签: swift


【解决方案1】:
let value = 1397968
let rounded = Int(round(Double(value) / 100) * 100)
print(rounded)

->1398000

【讨论】:

  • 这也具有正确舍入负值的优点。但是,它不适用于 very 大整数,例如123456789012345678 舍入为 123456789012345696。
  • 123456789012345678 远低于 Int.max。问题是 Double 的尾数只有 54 位,因此如果 value>2^54,Double(value) 会失去精度。
  • 也是。在您编辑之前,它是 Int.max ;-)
  • 是的,我改变了它(使用 Int.max 你的代码溢出) - 很抱歉造成混乱。当然,这些只是极端情况,可能与大多数应用程序无关。 1,234,567,890,123,456,78 将 > 1234 万亿,并且不太可能作为您使用的数量:)
【解决方案2】:

如果你想将向下四舍五入到 100 的倍数,那么你可以 这样做(正如@vadian 在评论中所说):

let amount = 1397968
let rounded = amount/100 * 100
print(rounded) // 1397900

这是因为整数除法截断结果 趋近于零:amount/100 计算为13979,然后相乘 再乘 100 得到1397900

但是您要求给定整数的最近倍数 100, 这可以通过一个小的修改来完成:

let amount = 1397968
let rounded = (amount + 50)/100 * 100
print(rounded) // 1398000

对于非负整数。如果你有正面和负面 值然后@shallowThought's answer 可能是最简单的 要走的路。但它也可以用纯整数算术来完成 (使用Make Int round off to nearest value的方法):

func roundToHundreds(_ value: Int) -> Int {
    return value/100 * 100 + (value % 100)/50 * 100
}

roundToHundreds(123) // 100
roundToHundreds(188) // 200

roundToHundreds(-123) // -100
roundToHundreds(-188) // -200

这适用于Int的全部范围:

roundToHundreds(Int.max) // 9223372036854775800
roundToHundreds(Int.min) // -9223372036854775800

【讨论】:

    【解决方案3】:

    请参阅 @Martin R 的帖子以获得更详细的答案。

    正如@vadian所说,你可以写

    let value = 1397968
    let rounded = value / 100 * 100
    

    现在可以打印了

    print(rounded) // 1397900
    

    【讨论】:

    • 是的,就是这样!谢谢,让我们变得如此简单!
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2018-01-19
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多