Округление двойного значения до x количества знаков после запятой в быстром

395

Может кто-нибудь сказать мне, как округлить двойное значение до х числа десятичных знаков в Swift?

Я имею:

var totalWorkTimeInHours = (totalWorkTime/60/60)

С totalWorkTimeNSTimeInterval (двойной) в секунду.

totalWorkTimeInHours даст мне часы, но это даст мне количество времени в таком длинном точном числе, например 1.543240952039 ......

Как мне округлить до, скажем, 1.543 при печати totalWorkTimeInHours?

Лейтон
источник
1
Смотрите мой ответ , чтобы найти до 9 различных способов вокруг двойного с использованием Дарвина round(_:), Double round(), NSStringинициализатором, Stringинициализатором, NumberFormatter, двойное расширением или даже NSDecimalNumberи Decimal.
Imanou Petit
@Rounded, оболочка быстрого свойства 5.1: gist.github.com/abhijithpp/1cc41b41a5d1c8f007da90f20bc0c65f
Абхиджит,

Ответы:

389

Вы можете использовать roundфункцию Swift для достижения этой цели.

Для округления Doubleс точностью до 3 цифр сначала умножьте его на 1000, округлите и разделите округленный результат на 1000:

let x = 1.23556789
let y = Double(round(1000*x)/1000)
print(y)  // 1.236

Помимо любого вида printf(...)или String(format: ...)решения, результат этой операции все еще имеет тип Double.

РЕДАКТИРОВАТЬ:
Что касается комментариев, которые иногда не работают, пожалуйста, прочитайте это:

Что каждый программист должен знать об арифметике с плавающей точкой

zisoft
источник
По некоторым причинам это не помогает .. Я использую это в следующем случае TransformOf <Double, String> (fromJSON: {Double (round (($ 0! As NSString) .doubleValue * 100) / 100)}, toJSON: {"($ 0)"})
Фоукс
29
У меня не работает на детской площадке: let rate = 9.94999999999; Double(round(rate * 100) / 100);Вывод: 9.94999999999, 9.949999999999999работает только для печати, но как я могу назначить его переменной?
Александр Яковлев
Вы должны использовать десятичную для этого, а не обычные двойные.
csotiriou
13
«Что должен знать каждый компьютерщик об арифметике с плавающей точкой» - это 73 страницы. Что такое TL; DR? :)
JaredH
1
@HardikDG Не помню, извините :-)
Александр Яковлев
431

Удлинитель для Swift 2

Более общим решением является следующее расширение, которое работает с Swift 2 и iOS 9:

extension Double {
    /// Rounds the double to decimal places value
    func roundToPlaces(places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return round(self * divisor) / divisor
    }
}


Удлинитель для Swift 3

В Swift 3 roundзаменяется rounded:

extension Double {
    /// Rounds the double to decimal places value
    func rounded(toPlaces places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}


Пример, который возвращает Double, округленный до 4 десятичных знаков:

let x = Double(0.123456789).roundToPlaces(4)  // x becomes 0.1235 under Swift 2
let x = Double(0.123456789).rounded(toPlaces: 4)  // Swift 3 version
Себастьян
источник
17
Характер двойного Swift, как представляется, заключается в том, что он может быть неточным - из-за способа хранения / доступа к нему в двоичном формате даже использование этой функции округления не вернет число, округленное до 3 десятичных знаков: например, round(8.46 * pow(10.0, 3.0)) / pow(10.0, 3.0)возврат 8.460000000000001. Делать то же самое с Float, по крайней мере, в этом сценарии , на самом деле, похоже, работает: round(Float(8.46) * pow(10.0, 3.0)) / pow(10.0, 3.0)доходность 8.46. Просто кое-что стоит отметить.
Бен Сауфли
2
К сожалению, это больше не работает в Swift 3, я получаю эту ошибкуNo '*' candidates produce the expected contextual result type 'FloatingPointRoundingRule'
koen
2
Я обновил решение и добавил расширение для Swift 3.
Себастьян
2
Чтобы быть более быстрым, 3 ... вы должны сменить на func round (toPlaces place: Int) -> Double
FouZ
2
@BenSaufley Но это также не работает, если вы введете 98.68. В этом случае я получаю 98.6800003
Александр Хитев
340

Как мне округлить до, скажем, 1.543 при печати totalWorkTimeInHours ?

Чтобы округлить totalWorkTimeInHoursдо 3 цифр для печати, используйте Stringконструктор, который принимает formatстроку:

print(String(format: "%.3f", totalWorkTimeInHours))
vacawama
источник
24
Это усечение, а не округление
Eyeball
33
@Eyeball: На самом деле, это делает раунд. Это то же самое поведение, что и функциональность C printf, которая округляет до запрошенных цифр. Так что String(format: "%.3f", 1.23489)печатает1.235
zisoft
6
Оригинальный постер ищет числовое значение для использования, а не строку для отображения.
pr1001
17
@ pr1001, возможно, и так, но это было неясно в то время, и 46 других сочли мой ответ полезным. Переполнение стека - это больше, чем просто помощь оператору.
Vacawama
3
странно, это возвращает 0,00 каждый раз.
Эрик Х
254

В Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из 9 следующих стилей , чтобы получить округленный результат от a Double.


# 1. Используя FloatingPoint rounded()метод

В простейшем случае вы можете использовать Double rounded()метод.

let roundedValue1 = (0.6844 * 1000).rounded() / 1000
let roundedValue2 = (0.6849 * 1000).rounded() / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 2. Используя FloatingPoint rounded(_:)метод

let roundedValue1 = (0.6844 * 1000).rounded(.toNearestOrEven) / 1000
let roundedValue2 = (0.6849 * 1000).rounded(.toNearestOrEven) / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 3. Использование roundфункции Дарвина

Фонд предлагает roundфункцию через Дарвина.

import Foundation

let roundedValue1 = round(0.6844 * 1000) / 1000
let roundedValue2 = round(0.6849 * 1000) / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 4. Использование Doubleсобственного метода расширения, созданного с помощью Darwin roundи powфункций

Если вы хотите повторить предыдущую операцию много раз, рефакторинг вашего кода может быть хорошей идеей.

import Foundation

extension Double {
    func roundToDecimal(_ fractionDigits: Int) -> Double {
        let multiplier = pow(10, Double(fractionDigits))
        return Darwin.round(self * multiplier) / multiplier
    }
}

let roundedValue1 = 0.6844.roundToDecimal(3)
let roundedValue2 = 0.6849.roundToDecimal(3)
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 5. Используя NSDecimalNumber rounding(accordingToBehavior:)метод

При необходимости NSDecimalNumberпредлагает подробное, но мощное решение для округления десятичных чисел.

import Foundation

let scale: Int16 = 3

let behavior = NSDecimalNumberHandler(roundingMode: .plain, scale: scale, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true)

let roundedValue1 = NSDecimalNumber(value: 0.6844).rounding(accordingToBehavior: behavior)
let roundedValue2 = NSDecimalNumber(value: 0.6849).rounding(accordingToBehavior: behavior)

print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 6. Используя NSDecimalRound(_:_:_:_:)функцию

import Foundation

let scale = 3

var value1 = Decimal(0.6844)
var value2 = Decimal(0.6849)

var roundedValue1 = Decimal()
var roundedValue2 = Decimal()

NSDecimalRound(&roundedValue1, &value1, scale, NSDecimalNumber.RoundingMode.plain)
NSDecimalRound(&roundedValue2, &value2, scale, NSDecimalNumber.RoundingMode.plain)

print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 7. Использование NSString init(format:arguments:)инициализатора

Если вы хотите получить возврат NSStringиз операции округления, использование NSStringинициализатора является простым, но эффективным решением.

import Foundation

let roundedValue1 = NSString(format: "%.3f", 0.6844)
let roundedValue2 = NSString(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685

# 8. Использование String init(format:_:)инициализатора

StringТип Swift соединен с NSStringклассом Foundation . Следовательно, вы можете использовать следующий код для возврата Stringиз операции округления:

import Foundation

let roundedValue1 = String(format: "%.3f", 0.6844)
let roundedValue2 = String(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685

# 9. С помощьюNumberFormatter

Если вы ожидаете получить String?от вашей операции округления, NumberFormatterпредлагает очень настраиваемое решение.

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
formatter.roundingMode = NumberFormatter.RoundingMode.halfUp
formatter.maximumFractionDigits = 3

let roundedValue1 = formatter.string(from: 0.6844)
let roundedValue2 = formatter.string(from: 0.6849)
print(String(describing: roundedValue1)) // prints Optional("0.684")
print(String(describing: roundedValue2)) // prints Optional("0.685")
Imanou Petit
источник
1
Отличный ответ. Я мог бы предложить на # 5, что вы могли бы рассмотреть возможность использования Decimal, который бесплатный для моста NSDecimalNumber. Decimalявляется родным тип и предлагает Свифта более изящная поддержка родных операторов , как +, -и т.д.
Rob
@Rob Я обновил свой ответ с помощью NSDecimalRound(_:_:_:_:)функции. Спасибо.
Imanou Petit
Использование выбора # 9 гарантирует, что вы будете ожидать фиксированную дробь (количество прецизионных цифр), скажем, десятичное число 43.12345 и дробь = 6, вы получите 43.123450
Almas
1
@ImanouPetit Спасибо, что опубликовали это. Я могу уничтожить пару расширений.
Адриан
Мне грустно NumberFormatter, что последний вариант, хотя он должен быть первым для представления чисел пользователям. Ни один другой метод не генерирует правильно локализованные числа.
Султан
93

В Swift 2.0 и Xcode 7.2:

let pi: Double = 3.14159265358979
String(format:"%.2f", pi)

Пример:

введите описание изображения здесь

Клаудио Гирунас
источник
50

Это полностью проработанный код

Swift 3.0 / 4.0 / 5.0, Xcode 9.0 GM / 9.2 и выше

let doubleValue : Double = 123.32565254455
self.lblValue.text = String(format:"%.f", doubleValue)
print(self.lblValue.text)

выход - 123

let doubleValue : Double = 123.32565254455
self.lblValue_1.text = String(format:"%.1f", doubleValue)
print(self.lblValue_1.text)

выход - 123,3

let doubleValue : Double = 123.32565254455
self.lblValue_2.text = String(format:"%.2f", doubleValue)
print(self.lblValue_2.text)

выход - 123,33

let doubleValue : Double = 123.32565254455
self.lblValue_3.text = String(format:"%.3f", doubleValue)
print(self.lblValue_3.text)

выход - 123,326

Крунал Патель
источник
1
одна строка ?, похоже на 3 строки;)
Петтер Фриберг
Вы не можете рассчитывать вещи, используя строки, я не думаю, что это правильный ответ, потому что это только для отображения.
JBarros35
25

Основываясь на ответе Йога, вот функция Swift, которая делает эту работу:

func roundToPlaces(value:Double, places:Int) -> Double {
    let divisor = pow(10.0, Double(places))
    return round(value * divisor) / divisor
}
ясень
источник
20

В Swift 3.0 и Xcode 8.0:

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

Используйте это расширение так:

let doubleValue = 3.567
let roundedValue = doubleValue.roundTo(places: 2)
print(roundedValue) // prints 3.56
Джайсвал Раджан
источник
19

Swift 4, Xcode 10

yourLabel.text =  String(format:"%.2f", yourDecimalValue)
Naishta
источник
1
Я не понизил голос, но я думаю, что причина может быть в том, что это возвращает строковое представление числа, а не числа. Это хорошо, если это все, что вам нужно, но вы можете захотеть, чтобы само число было округлено для дальнейшего использования. ОП сказал «когда я печатаю», поэтому я считаю, что это приемлемое, простое и чистое решение в этом случае.
Бен Шталь
1
Отлично. Одноканальное решение. Мне просто нужно было показать десятичные значения в виде строк в моих ярлыках.
Зеешан
18

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

var a = 1.543240952039
var roundedString = String(format: "%.3f", a)

Здесь% .3f сообщает swift, чтобы это число было округлено до 3 десятичных знаков. И если вы хотите получить двойное число, вы можете использовать этот код:

// String to Double

var roundedString = Double(String(format: "%.3f", b))

Рамазан Карами
источник
14

Используйте встроенную библиотеку Foundation Darwin

SWIFT 3

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

Применение:

let number:Double = 12.987654321
print(number.round(to: 3)) 

Выходы: 12,988

Джордж Филиппакос
источник
9

Удобным способом может быть использование расширения типа Double

extension Double {
    var roundTo2f: Double {return Double(round(100 *self)/100)  }
    var roundTo3f: Double {return Double(round(1000*self)/1000) }
}

Применение:

let regularPie:  Double = 3.14159
var smallerPie:  Double = regularPie.roundTo3f  // results 3.142
var smallestPie: Double = regularPie.roundTo2f  // results 3.14
Марко Леонг
источник
9

Если вы хотите округлить Doubleзначения, вы можете использовать Swift, Decimalчтобы не допустить ошибок, которые могут возникнуть при попытке вычислить эти округленные значения. Если вы используете Decimal, он может точно представлять десятичные значения этого округленного значения с плавающей запятой.

Так что вы можете сделать:

extension Double {
    /// Convert `Double` to `Decimal`, rounding it to `scale` decimal places.
    ///
    /// - Parameters:
    ///   - scale: How many decimal places to round to. Defaults to `0`.
    ///   - mode:  The preferred rounding mode. Defaults to `.plain`.
    /// - Returns: The rounded `Decimal` value.

    func roundedDecimal(to scale: Int = 0, mode: NSDecimalNumber.RoundingMode = .plain) -> Decimal {
        var decimalValue = Decimal(self)
        var result = Decimal()
        NSDecimalRound(&result, &decimalValue, scale, mode)
        return result
    }
}

Затем вы можете получить округленное Decimalзначение следующим образом:

let foo = 427.3000000002
let value = foo.roundedDecimal(to: 2) // results in 427.30

И если вы хотите отобразить его с указанным количеством десятичных знаков (а также локализовать строку для текущей локали пользователя), вы можете использовать NumberFormatter:

let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2

if let string = formatter.string(for: value) {
    print(string)
}
обкрадывать
источник
2
Лучший ответ на данный момент.
Codetard,
(4.81).roundedDecimal(to: 2, mode: .down)вернет 4.8 вместо 4.81, используйте Decimal(string: self.description)!для точногоdecimalValue
vk.edward.li
1
@ vk.edward.li - Да, следует с осторожностью относиться к округлению десятичных дробей вверх / вниз, потому что такие значения, как 4.81, просто не могут быть точно представлены с Double(становится 4.8099999999999996). Но я бы посоветовал не использовать description(поскольку округление, которое он использует, не задокументировано и может быть изменено). Если вы действительно хотите делать математику с точностью до десятичного знака, вам следует избегать Doubleцеликом и вместо этого использовать Decimalнапрямую (например, Decimal(sign: .plus, exponent: -2, significand: 481)или Decimal(string: "4.81"). Но не используйте description.
Роб
@Rob обычно невозможно получить строковое значение «4.81», если оно хранится как Double, поэтому вы должны использовать self.description (модифицированный алгоритм Grisu2), чтобы исправить потерянную
точность
Я понимаю вашу точку зрения. Я просто не согласен с вашим решением. Поведение descriptionметода округления не задокументировано и не гарантировано. Плюс, это не локализовано. ИМХО, это ошибка использовать descriptionдля чего-либо кроме целей регистрации. Я бы использовал Decimalвсюду, избегая использования Doubleцеликом, или просто использовал другой режим округления. Или, если необходимо, используйте свой собственный локализованный метод, который использует алгоритм в стиле Грису (но это кажется ненужным, когда вы знаете, сколько десятичных разрядов вы хотите округлить). Но я бы не стал полагаться на это вспомогательное поведение description.
Роб
8

Это своего рода долгий обходной путь, который может пригодиться, если ваши потребности немного сложнее. Вы можете использовать средство форматирования чисел в Swift.

let numberFormatter: NSNumberFormatter = {
    let nf = NSNumberFormatter()
    nf.numberStyle = .DecimalStyle
    nf.minimumFractionDigits = 0
    nf.maximumFractionDigits = 1
    return nf
}()

Предположим, что ваша переменная, которую вы хотите напечатать

var printVar = 3.567

Это гарантирует, что он будет возвращен в желаемом формате:

numberFormatter.StringFromNumber(printVar)

Таким образом, результатом здесь будет «3,6» (округлено). Хотя это не самое экономичное решение, я даю его, потому что OP упоминает печать (в этом случае строка не является нежелательной), и потому что этот класс позволяет устанавливать несколько параметров.

Inkidu616
источник
1
Небольшое замечание, что любой форматтер достаточно дорогой программно, что делает его необоснованным для задач, которые необходимо выполнять быстро или многократно.
Джонатан Торнтон
7

я хотел бы использовать

print(String(format: "%.3f", totalWorkTimeInHours))

и измените .3f на любое количество десятичных чисел, которое вам нужно

Мохсен Хоссейн лей
источник
Он хотел напечатать 3-мя цифрами, чтобы не получить его в NSTimeInterval
Мохсен Хоссейн за
7

Или:

  1. Использование String(format:):

    • Приведение Doubleк Stringс %.3fспецификатор формата , а затем обратноDouble

      Double(String(format: "%.3f", 10.123546789))!
    • Или расширить Doubleдля обработки N-десятичных разрядов:

      extension Double {
          func rounded(toDecimalPlaces n: Int) -> Double {
              return Double(String(format: "%.\(n)f", self))!
          }
      }
  2. По расчету

    • умножьте на 10 ^ 3, округлите его и затем разделите на 10 ^ 3 ...

      (1000 * 10.123546789).rounded()/1000
    • Или расширить Doubleдля обработки N-десятичных разрядов:

      extension Double {    
          func rounded(toDecimalPlaces n: Int) -> Double {
              let multiplier = pow(10, Double(n))
              return (multiplier * self).rounded()/multiplier
          }
      }
staticVoidMan
источник
6

Это более гибкий алгоритм округления до N значащих цифр

Swift 3 решение

extension Double {
// Rounds the double to 'places' significant digits
  func roundTo(places:Int) -> Double {
    guard self != 0.0 else {
        return 0
    }
    let divisor = pow(10.0, Double(places) - ceil(log10(fabs(self))))
    return (self * divisor).rounded() / divisor
  }
}


// Double(0.123456789).roundTo(places: 2) = 0.12
// Double(1.23456789).roundTo(places: 2) = 1.2
// Double(1234.56789).roundTo(places: 2) = 1200
Никита Иванющенко
источник
6

Лучший способ отформатировать двойное свойство - это использовать предопределенные методы Apple.

mutating func round(_ rule: FloatingPointRoundingRule)

FloatingPointRoundingRule - это перечисление, которое имеет следующие возможности

Случаи перечисления:

case awayFromZero Округлить до ближайшего допустимого значения, величина которого больше или равна величине источника.

case down Округление до ближайшего допустимого значения, которое меньше или равно источнику.

case toNearestOrAwayFromZero Округлить до ближайшего допустимого значения; если два значения одинаково близки, выбирается значение с большей величиной.

case toNearestOrEven Округлить до ближайшего допустимого значения; если два значения одинаково близки, выбирается четное.

случай в направлении нуля. Округление до ближайшего допустимого значения, величина которого меньше или равна величине источника.

case up Округлить до ближайшего допустимого значения, которое больше или равно источнику.

var aNumber : Double = 5.2
aNumber.rounded(.up) // 6.0
Абузар Манзур
источник
6

округлите двойное значение до x числа десятичного числа
NO. цифр после десятичной

var x = 1.5657676754
var y = (x*10000).rounded()/10000
print(y)  // 1.5658 

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

var x = 1.5657676754
var y = (x*10).rounded()/10
print(y)  // 1.6
Айман Бадр
источник
Что происходит с этим кодом? Что демонстрируют три примера?
Рене
Ответы только на код не помогают, попробуйте объяснить, что делает каждый из этих примеров.
Мо
5

Не Свифт, но я уверен, что вы поняли идею.

pow10np = pow(10,num_places);
val = round(val*pow10np) / pow10np;
йог
источник
4

Это похоже на работу в Swift 5.

Весьма удивлен, что для этого уже нет стандартной функции.

// Усечение двойных до n-десятичных разрядов с округлением

extension Double {

    func truncate(to places: Int) -> Double {
    return Double(Int((pow(10, Double(places)) * self).rounded())) / pow(10, Double(places))
    }

}
Matiu Awaiti
источник
2

Вы можете добавить это расширение:

extension Double {
    var clean: String {
        return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)
    }
}

и назовите это так:

let ex: Double = 10.123546789
print(ex.clean) // 10.12
TOUZENE Мохамед Васим
источник
Это аккуратная реализация представления его в виде строки. Интересно, возможно ли или рационально написать расширение представления числа цифр после периода, все еще поддерживая это как Двойной.
Thinkswift
2

Чтобы избежать недостатков Float, используйте Decimal

extension Float {
    func rounded(rule: NSDecimalNumber.RoundingMode, scale: Int) -> Float {
        var result: Decimal = 0
        var decimalSelf = NSNumber(value: self).decimalValue
        NSDecimalRound(&result, &decimalSelf, scale, rule)
        return (result as NSNumber).floatValue
    }
}

ех.
1075,58 раундов до 1075,57 при использовании Float со шкалой: 2 и .down
1075,58 раундов до 1075,58 при использовании десятичного со шкалой: 2 и .down

Ерванд Сарибекян
источник
1

Я обнаружил, что это интересно, если можно исправить ввод пользователя. Это если они вводят три знака после запятой вместо двух для суммы в долларах. Скажем, 1.111 вместо 1.11, вы можете исправить это путем округления? Ответ по многим причинам - нет! Если деньги превышают 0,001, это может вызвать проблемы в реальной чековой книжке.

Вот функция для проверки ввода пользователем слишком большого количества значений после периода. Но что позволит 1., 1.1 и 1.11.

Предполагается, что значение уже проверено на успешное преобразование из String в Double.

//func need to be where transactionAmount.text is in scope

func checkDoublesForOnlyTwoDecimalsOrLess()->Bool{


    var theTransactionCharacterMinusThree: Character = "A"
    var theTransactionCharacterMinusTwo: Character = "A"
    var theTransactionCharacterMinusOne: Character = "A"

    var result = false

    var periodCharacter:Character = "."


    var myCopyString = transactionAmount.text!

    if myCopyString.containsString(".") {

         if( myCopyString.characters.count >= 3){
                        theTransactionCharacterMinusThree = myCopyString[myCopyString.endIndex.advancedBy(-3)]
         }

        if( myCopyString.characters.count >= 2){
            theTransactionCharacterMinusTwo = myCopyString[myCopyString.endIndex.advancedBy(-2)]
        }

        if( myCopyString.characters.count > 1){
            theTransactionCharacterMinusOne = myCopyString[myCopyString.endIndex.advancedBy(-1)]
        }


          if  theTransactionCharacterMinusThree  == periodCharacter {

                            result = true
          }


        if theTransactionCharacterMinusTwo == periodCharacter {

            result = true
        }



        if theTransactionCharacterMinusOne == periodCharacter {

            result = true
        }

    }else {

        //if there is no period and it is a valid double it is good          
        result = true

    }

    return result


}
Горный человек
источник
1
//find the distance between two points
let coordinateSource = CLLocation(latitude: 30.7717625, longitude:76.5741449 )
let coordinateDestination = CLLocation(latitude: 29.9810859, longitude: 76.5663599)
let distanceInMeters = coordinateSource.distance(from: coordinateDestination)
let valueInKms = distanceInMeters/1000
let preciseValueUptoThreeDigit = Double(round(1000*valueInKms)/1000)
self.lblTotalDistance.text = "Distance is : \(preciseValueUptoThreeDigit) kms"
Davender Verma
источник
1
extension String{
  var roundedValue:String {
     return String(format: "%.3f", self)
}}

Применение :

totalWorkTimeInHours.roundedValue
Бхаргав Сейпал
источник
1

Вот один из них для SwiftUI, если вам нужен элемент Text с числовым значением.

struct RoundedDigitText : View {
    let digits : Int
    let number : Double

    var body : some View {
        Text(String(format: "%.\(digits)f", number))
    }
}
FrankByte.com
источник