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

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"
JAL
источник
При округлении до двух десятичных знаков должно быть 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 округлить это число до двух знаков после запятой.

Merichle
источник
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
String(format: "%.2f", Double(round(1000*34.578)/1000))

Выход: 34,58

Shobhit C
источник
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)!
}

Надеюсь, это поможет.

Дэйв Y
источник
-1

если вы дадите ему 234,545332233, он даст вам 234,54

let textData = Double(myTextField.text!)!
let text = String(format: "%.2f", arguments: [textData])
mylabel.text = text
Акбар Хан
источник
-4

Всего одна строка кода:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Г-н Джавед Мултани
источник