将小数点后两位取整


85

如何currentRatio将小数点后两位取整?

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

您是要舍入currentRatio到小数点后两位还是总是舍入?例如:您要3.141-> 3.14还是3.141-> 3.14?
2016年

JAL,您好,我想让3.149显示为3.15。但是3.141应该显示3.14。谢谢
Del Hinds

有关正确的舍入,请参见我的答案的第一部分。
2016年

Answers:


170

使用格式字符串将其舍入到两位小数,然后将转换doubleString

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"

如果四舍五入到小数点后两位,则需要为3.15。
马特·勒·弗勒

我以为OP只是想四舍五入到小数点后两位,必要时四舍五入。刚刚添加评论要求澄清。
2016年

嗨,贾尔,谢谢,我使用了您的答案,并做了如下修改:-_ = Double(rxCurrentTextField.text!)!/双(txCurrentTextField.text!)!railRatioLabelField.text!=字符串(格式:“%。2f”,currentRatio)
Del Hinds

2
答案是对以下问题的回答:“如何在文本标签中显示带有两位数字的Double”或“ ...作为字符串”,此答案不能回答“将double向上
舍入

@JAL我需要点之后的olny .5或0。如果我们有23.4,则应该给出23.5,如果是23.8,则应该给出24.0
大师

29

(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"
}

辉煌。我实际上想转换为相同的属性(双精度)。您的扩展程序解决了我的问题。谢谢!
Marcelo dos Santos

:-)快乐编码
Mehul

我认为您的答案是正确的。我只想对func添加语法修改。func round(to places: Int) -> Double {
23inhouse

1
@ 23inhouse,我已根据您的建议更新了答案。谢谢
Mehul

28

已更新至SWIFT 4,并提供了该问题的正确答案

如果要舍入到小数点后2位,则应乘以100,然后将其四舍五入,然后除以100

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

1
嗨-我不明白您如何计算返回一定数量的小数。如果我希望它返回小数点后三位怎么办?
Sipho Koza

@SiphoKoza只需将其乘以1000,然后除以1000
Chetan Rajagiri

这并不是真正的“正确”答案,因为在内部,该数字保存在以2为底的浮点数中,并且您尝试表示以10为底的数字。对于某些数字,没有精确的表示形式,当您打印该值时,您将得到太多的数字。正确的答案应该返回一个字符串,而不是Double或Float。
维克多·恩格尔

@levan它也适用于零,只需确保它是双
精度

1
很好的答案,我认为这应该被接受。
אוריorihpt

13

考虑将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

11

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

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

let a = 45.666

print(a.dollarString) //will print "$45.67"

1
不应为print(a.dollarString)吗?
glm4

5

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

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

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


4

@Rounded,一个快速的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


0

对于像我这样的菜鸟来说,只是一个快速的后续答案:

通过使用带有输出函数,可以使其他答案超级容易实现。例如

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

这样,只要您想将值保留到小数点后2位,只需键入

twoDecimals(“您的电话号码在这里”)

...

简单!

Ps也可以通过在String转换后再次将其转换为Float值或任何所需的值,如下所示:

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

希望能有所帮助。


-1

如果您给它234.545332233它会给您234.54

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.