Округліть удвічі до 2 знаків після коми


85

Як округлити 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. Дякую
Дель Хіндс

Дивіться першу частину моєї відповіді щодо правильного округлення.
JAL

Відповіді:


170

Використовуйте рядок формату округлити до двох знаків після коми і перетворити 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, якщо округлювати до двох знаків після коми.
Matt Le Fleur

Я думав, що ОП просто хоче округлити до двох знаків після коми, округлюючи вгору або вниз за необхідності. Просто додав коментар із проханням пояснити.
JAL

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

2
Ця відповідь на запитання: "Як відобразити Double з двома цифрами в текстовій мітці" або "... як рядок", ця відповідь не відповідає на запитання "Округлити вдвічі до 2 знаків після коми"
mnl

@JAL мені потрібно олн .5 або 0 після пункту Для напр. якщо у нас 23,4, це має дати 23,5, а якщо 23,8
гуру

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

Блискуче. Я насправді хотів перетворити на те саме майно (подвійне). Ваше розширення вирішило мою проблему. Дякую!
Марсело дос Сантос

:-) Щасливий кодування
Mehul

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

1
@ 23inhouse, я оновив відповідь відповідно до ваших пропозицій. Дякую
Мехул

28

Оновлено до SWIFT 4 та відповідна відповідь на запитання

Якщо ви хочете округлити до 2 знаків після коми, потрібно помножити на 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 Це працює і для нуля, просто переконайтеся, що це дубль
Четан Раджагірі

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 каже швидкому зробити це число округленим до 2 знаків після коми.


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 Ви також можете змусити його повернути значення 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.