Округлить до двух знаков после запятой


88

Как округлить до currentRatioдвух десятичных знаков?

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

Вы хотите просто округлять currentRatioдо двух десятичных знаков или всегда округлять в большую сторону? Пример: вы хотите 3.141 -> 3.14 или 3.141 -> 3.14?
JAL

Привет, JAL, я хочу, чтобы 3.149 отображалось как 3.15. Однако 3.141 должен отображать 3.14. Спасибо
Del Hinds

См. Первую часть моего ответа для правильного округления.
JAL

Ответы:


174

Используйте строку формата округлить до двух знаков после запятой и преобразовать 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"

При округлении до двух десятичных знаков должно быть 3,15.
Мэтт Ле Флер,

Я думал, что OP просто хотел округлить до двух десятичных знаков, округляя вверх или вниз по мере необходимости. Только что добавил комментарий с просьбой пояснить.
JAL

Привет, Джал, Спасибо, я использовал ваш ответ, который работал с небольшой модификацией, а именно: - _ = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)! railRatioLabelField.text! = Строка (формат: "% .2f", currentRatio)
Дель Хайндс,

2
Это ответ на вопрос: «Как отобразить Double с двумя цифрами в текстовой метке» или «... в виде строки», этот ответ не отвечает на вопрос «
Округлить

@JAL мне нужно только 0,5 или 0 после точки Например. если у нас 23,4, должно получиться 23,5, а если 23,8 должно быть 24,0
guru

33

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

Блестяще. Я действительно хотел преобразовать в то же свойство (double). Ваше расширение решило мою проблему. Спасибо!
Марсело душ Сантуш


Думаю, ваш ответ правильный. Я просто хотел бы добавить модификацию синтаксиса к файлу func. func round(to places: Int) -> Double {
23inhouse

1
@ 23inhouse, я обновил ответ в соответствии с вашими предложениями. Спасибо
Mehul

29

Обновлено до SWIFT 4 и правильный ответ на вопрос

Если вы хотите округлить до двух знаков после запятой, умножьте на 100, затем округлите и разделите на 100

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

1
Привет, я не понимаю, как вы рассчитываете с точки зрения возврата определенного десятичного числа. Что, если я хочу вернуть 3 десятичных знака?
Сифо Коза

@SiphoKoza, просто умножьте это на 1000, а затем разделите на 1000
Четан Раджагири

Это не совсем «правильный» ответ, потому что внутри число сохраняется в формате с плавающей запятой, с основанием 2, а вы пытаетесь представить число с основанием 10. Для некоторых чисел нет точного представления, и вы получите слишком много цифр, когда пойдете печатать значение. Правильный ответ должен возвращать строку, а не Double или Float.
Виктор Энгель

@levan Это работает и для нуля, только убедитесь, что это дабл
Chetan Rajagiri

1
Отличный ответ, я думаю, что это должно быть принято.
אורי orihpt

15

Подумайте об использовании 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

Я прошел через многие, это НАМНОГО, ЛУЧШЕЕ решение! Спасибо огромное!
kalafun

13

Добавляя к приведенному выше ответу, если мы хотим отформатировать 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

4

Код для конкретных цифр после десятичных знаков:

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


2

Просто быстрый ответ для новичков вроде меня:

Вы можете сделать другие ответы очень легко реализуемыми, используя функцию с выходом . Например

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

Таким образом, всякий раз, когда вы хотите получить значение до двух знаков после запятой, вы просто набираете

twoDecimals ('Здесь твой номер ')

...

Просто!

Ps. Вы также можете заставить его возвращать значение с плавающей запятой или что угодно, затем снова преобразовав его после преобразования String следующим образом:

 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.