四舍五入到小数点后两位

Round up double to 2 decimal places

如何将 currentRatio 四舍五入到小数点后两位?

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = "\(currentRatio)"

使用格式字符串四舍五入到小数点后两位并将 double 转换为 String:

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = String(format: "%.2f", currentRatio)

示例:

let myDouble = 3.141
let doubleStr = String(format: "%.2f", myDouble) // "3.14"

如果你想将最后一位小数四舍五入,你可以这样做(感谢 Phoen1xUK):

let myDouble = 3.141
let doubleStr = String(format: "%.2f", ceil(myDouble*100)/100) // "3.15"

如果我们想多次格式化 Double,请添加到上面的答案中,我们可以使用 Double 的协议扩展,如下所示:

extension Double {
    var dollarString:String {
        return String(format: "$%.2f", self)
    }
}

let a = 45.666

print(a.dollarString) //will print ".67"

考虑为此目的使用 NumberFormatter,如果您想打印比率的百分号或者如果您有货币和大数字之类的东西,它会提供更大的灵活性。

let amount = 10.000001
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
let formattedAmount = formatter.string(from: amount as NSNumber)! 
print(formattedAmount) // 10
String(format: "%.2f", Double(round(1000*34.578)/1000))

输出:34.58

小数点后特定数字的代码是:

var roundedString = String(format: "%.2f", currentRatio)

这里的 %.2f 告诉 swift 将这个数字四舍五入到小数点后两位。

已更新至 SWIFT 4 以及问题的正确答案

如果你想四舍五入到小数点后两位,你应该乘以 100 然后四舍五入,然后除以 100

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 

只需一行代码:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])

如果你给它 234.545332233 它会给你 234.54

let textData = Double(myTextField.text!)!
let text = String(format: "%.2f", arguments: [textData])
mylabel.text = text

(Swift 4.2 Xcode 11) 简单易用扩展名:-

extension Double {
    func round(to places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

使用:-

if let distanceDb = Double(strDistance) {
   cell.lblDistance.text = "\(distanceDb.round(to:2)) km"
}

像我这样的菜鸟的快速跟进回答:

您可以通过使用带有输出 的函数使其他答案变得非常容易实现。例如

  func twoDecimals(number: Float) -> String{
    return String(format: "%.2f", number)
}

这样,只要你想获取一个小数点后 2 位的值,你只需键入

twoDecimals('这里是你的号码')

...

简单!

P.s。您还可以将其 return 设为 Float 值,或任何您想要的值,然后在字符串转换后再次转换它,如下所示:

 func twoDecimals(number: Float) -> Float{
    let stringValue = String(format: "%.2f", number)
    return Float(stringValue)!
}

希望对您有所帮助。

@Rounded, 一个 swift 5.1 属性 包装器 示例:

struct GameResult {
    @Rounded(rule: NSDecimalNumber.RoundingMode.up,scale: 4)
    var score: Decimal
}

var result = GameResult()
result.score = 3.14159265358979
print(result.score) // 3.1416

也许还有:

// Specify the decimal place to round to using an enum
public enum RoundingPrecision {
    case ones
    case tenths
    case hundredths
    case thousands
}

extension Double {
    // Round to the specific decimal place
    func customRound(_ rule: FloatingPointRoundingRule, precision: RoundingPrecision = .ones) -> Double {
        switch precision {
        case .ones: return (self * Double(1)).rounded(rule) / 1
        case .tenths: return (self * Double(10)).rounded(rule) / 10
        case .hundredths: return (self * Double(100)).rounded(rule) / 100
        case .thousands: return (self * Double(1000)).rounded(rule) / 1000
        }
    }
}

let value: Double = 98.163846
print(value.customRound(.toNearestOrEven, precision: .ones)) //98.0
print(value.customRound(.toNearestOrEven, precision: .tenths)) //98.2
print(value.customRound(.toNearestOrEven, precision: .hundredths)) //98.16
print(value.customRound(.toNearestOrEven, precision: .thousands)) //98.164

保留小数,不截断而是舍入

详情请见连specified rounding rules

试试这个,你会得到比 0.0 更好的结果

extension Double {
    func rounded(toPlaces places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
    func toRoundedString(toPlaces places:Int) -> String {
        let amount = self.rounded(toPlaces: places)
        let str_mount = String(amount)
        
        let sub_amountStrings = str_mount.split(separator: ".")
        
        if sub_amountStrings.count == 1
        {
          var re_str = "\(sub_amountStrings[0])."
            for _ in 0..<places
            {
                re_str += "0"
            }
            return re_str
         
        }
        else if sub_amountStrings.count > 1, "\(sub_amountStrings[1])".count < places
        {
            var re_str = "\(sub_amountStrings[0]).\(sub_amountStrings[1])"
            let tem_places = (places -  "\(sub_amountStrings[1])".count)
              for _ in 0..<tem_places
              {
                  re_str += "0"
              }
            return re_str
        }
        
        return str_mount
    }
}