【问题标题】:In Swift how do I display a percentage value rounded up or down with no decimal places在 Swift 中,如何显示不带小数位的向上或向下舍入的百分比值
【发布时间】:2016-02-18 23:12:11
【问题描述】:

我认为这会相当简单,但我似乎无法解决或找到涵盖我情况的现有问题。

最初我设置了一些变量如下:

var score :Int! = 0
var totalquestionsasked :Int! = 0
var percentagecorrect :Int! = 0

这让我所有的值都计算得很好,但我遇到了百分比问题。

我的百分比基本公式是:

percentagecorrect = score / totalquestionsasked * 100

但是,当使用文本标签中的值时,我无法显示它。

所以经过一些研究,我将变量改为:

var score :Double = 0.0
var totalquestionsasked :Double = 0.0
var percentagecorrect :Double = 0.0

并且仍然使用相同的百分比公式:

percentagecorrect = score / totalquestionsasked * 100

但是,虽然这显示正常,但我不想要所有小数位。因此,经过更多研究后,我在另一个问题中发现了一个扩展,并将其改编为我的应用程序。我的扩展是:

extension Double {
    var roundTo0f: Double {return Double(round(1*self)/1) }
    var roundTo1f: Double {return Double(round(10*self)/10) }
    var roundTo2f: Double {return Double(round(100*self)/100)  }
    var roundTo3f: Double {return Double(round(1000*self)/1000) }
}

我已经尝试使用如下扩展:

percentagecorrect = score / totalquestionsasked * 100
let percentagevalue: Double = percentagecorrect.roundTo0f
labelPercent.text = "\(percentagevalue)"

最终结果是这非常接近我想要的。但是,它仍然显示百分比到小数点后 1 位。 (顺便说一句,它不准确 - 我的意思是,如果分数为 1 并且提出的问题数为 3,则上面的代码将百分比显示为 33.0 而不是 33.3,但我离题了)

我真正想要的是在显示值之前将值向上或向下舍入到最接近的整数。也就是说,我想要的是

  • 如果值为 33.3,则向下舍入为 33 并显示为 33
  • 如果值为 66.6,则向上舍入为 67 并显示为 67

也就是说,我希望显示的结果中没有小数位。目前,它正确向上/向下舍入,但最后仍显示“.0”。如果这不可能,那么我希望它正确显示到小数点后一位。

我是编程新手,Swift 是我尝试学习的第一门语言,所以也许这只是一个新手错误,但我真的找不到我做错了什么。

如何让它工作?

【问题讨论】:

    标签: swift


    【解决方案1】:

    您可以使用内置的 round 函数并转换为 Int。

    print(Int(round(33.3)))
    print(Int(round(66.6)))
    

    如果你想让一个扩展方法返回一个字符串,你可以这样:

    extension Double {
        func roundTo(decimalPlaces: Int) -> String {
            return NSString(format: "%.\(decimalPlaces)f", self) as String
        }
    }
    

    【讨论】:

    • 这对我来说是全新的,所以我花了一段时间,但我终于让它工作了。谢谢!
    【解决方案2】:

    在纯整数算术中,

    var score : Int = ...
    var totalquestionsasked : Int = ...
    let percentagecorrect = (score * 200 + totalquestionsasked)/(2 * totalquestionsasked)
    

    会成功的。


    这是如何工作的?计算百分比为

    (score * 100)/totalquestionsasked
    

    截断除法的结果向零。对于想要的 舍入行为,我们必须计算

    (score * 100)/totalquestionsasked + 1/2
    

    在浮点运算中,然后将结果截断为整数。 组合项给出表达式

    (score * 200 + totalquestionsasked)/(2 * totalquestionsasked)
    

    当以整数算术计算时,会给出正确的结果。

    【讨论】:

    • 感谢您也解释您的答案(对于新手来说非常有帮助)。我一定是做错了什么——我得到了 100.5% 的结果,其中 1 个问题的得分为 1。我是否在错误的地方使用了您建议的代码?目前我已经把percentagecorrect = score / totalquestionsasked * 100换成了var percentagecorrect = (score * 200 + totalquestionsasked)/(2 * totalquestionsasked)?
    • @Monomeeth:请注意,我使用Int 变量来表示得分和提出的总问题,而不是Double。我的“技巧”只适用于整数。如果您使用浮点数,那么 round() - 就像在另一个答案中一样 - 将是正确的做法。
    • 好的,所以如果我将变量改回原来的整数,那么假设百分比不会在诸如labelPercent.text = "\(percentage value)" 之类的代码中显示为字符串是否正确?
    • @Monomeeth:“显示为字符串”是什么意思?
    • 我的意思是计算出的整数结果,比如 33,会使用labelPercent.text = "\(percentage value)" 代码正确显示在我的文本标签中吗? (我的意思是 string 因为它是一个文本标签,但我的术语可能有点混淆)。
    【解决方案3】:

    您可以使用 NSString 的格式说明符并将其添加到您的 Double 扩展为函数。

    extension Double
    {
      func roundTo0f() -> NSString
      {
        return NSString(format: "%.0f", self)
      }
    
      func roundTo1f() -> NSString
      {
        return NSString(format: "%.1f", self)
      }
    
      func roundTo2f() -> NSString
      {
        return NSString(format: "%.2f", self)
      }
    
      func roundToNf(n : Int) -> NSString
      {
        return NSString(format: "%.\(n)f", self)
      }
    } 
    
    let d : Double = 9.12
    print(d.roundTo0f())
    print(d.roundTo1f())
    print(d.roundTo2f())
    

    【讨论】:

    • 我似乎无法让它工作。我的意思是,最终结果对我来说是一样的。但由于我对这一切都不熟悉,我可能只是错过了一些明显的东西。
    • 你一直在尝试什么价值观?
    • 好吧,我一定是真的错过了什么。这些值只是由我的问题中概述的代码生成的。当我使用你的代码时,计算肯定是正确的,但它仍然在我的labelPercent.text = "\(percentage value)" 代码填充的标签中显示小数点值。
    • 你需要调用roundTo0f,它会返回一个格式化的字符串。 labelPercent.text = "\(percentageValue.roundTo0f())"
    【解决方案4】:

    您可以自己完成。我假设一对一的答案得分评估。我已经插入了一些数字,因此您可以将其粘贴到操场上。您可以将“if left”中的值更改为您想要的任何值。 .51 等。仅仅因为 IRS 让你四舍五入 50 美分并不意味着你必须这样做。

    var score :Double! = 359
    var totalquestionsasked :Double! = 400
    var percentagecorrect :Double! = (score / totalquestionsasked) * 100
    var left = percentagecorrect - Double(Int(percentagecorrect))
    if left >=  0.50 {
    
        percentagecorrect = percentagecorrect + 1.0
    
    }
     var answer = Int(percentagecorrect)
    

    【讨论】:

      【解决方案5】:

      你可以使用这个扩展:

      extension Double {
      /// Rounds the double to decimal places value
      func roundToPlaces(places:Int) -> Double {
          let divisor = pow(10.0, Double(places))
          return round(self * divisor) / divisor
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多