Округление двойного значения до x количества знаков после запятой в быстром
Может кто-нибудь сказать мне, как округлить двойное значение до х числа десятичных знаков в Swift?
Я имею:
var totalWorkTimeInHours = (totalWorkTime/60/60)
С totalWorkTime
будучи NSTimeInterval (двойной) в секунду.
totalWorkTimeInHours
даст мне часы, но это даст мне количество времени в таком длинном точном числе, например 1.543240952039......
Как мне округлить это, скажем, до 1.543, когда я печатаю totalWorkTimeInHours
?
37 ответов
если вы хотите, чтобы после запятой оставалось только 0 для раунда, посмотрите на этот пример ниже:
extension Double {
func isInteger() -> Any {
let check = floor(self) == self
if check {
return Int(self)
} else {
return self
}
}
}
let toInt: Double = 10.0
let stillDouble: Double = 9.12
print(toInt.isInteger) // 10
print(stillDouble.isInteger) // 9.12
extension String{
var roundedValue:String {
return String(format: "%.3f", self)
}}
Использование:
totalWorkTimeInHours.roundedValue
//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"
Во многих примерах используется математика, проблема в том, что числа с плавающей запятой являются аппроксимацией действительного числа, нет способа точно выразить 0,1 (1/10) как число с плавающей запятой, так же как нет точного способа точно выразить ⅓ с помощью десятичных точек, поэтому вы нужно спросить себя, чего именно вы пытаетесь достичь, если вы просто хотите отобразить их, оставьте их такими, какие они есть в коде, попытка их округления оправдает получение менее точного результата, поскольку вы выбрасываете драгоценный, круглый ⅓ в десятичной записи до 1 десятичного знака не даст вам число ближе к ⅓, используйте NumberFormate, чтобы округлить его, если у вас есть что-то вроде класса viewModel, его можно использовать для возврата строкового представления к номерам ваших моделей. NumberFormaters дает вам большой контроль над форматированием чисел и количеством десятичных разрядов, которые вы хотите.
Для многих приложений вам нужно округлить точное количество знаков после запятой.
Для некоторых других у вас нет такого ограничения и вы хотите «сжать» размер вывода, но все же хотите избежать преобразования чисел в строки (и наоборот позже), как при экспорте JSON с миллионами чисел.
В этом случае вы можете использовать «трюк» для округления мантиссы (мантиссы), а не целого числа. В таком случае вы получите окончательные десятичные знаки, и большинство чисел все еще будут иметь максимум, например, 3 десятичных знака (если необходимо), в то время как у некоторых будет немного больше.
Это то, что вы можете ожидать от этого подхода, все еще работая с десятичными числами:
5.2472
5.2516
5.2556
5.26
5.264
вместо:
5.24731462499949
5.251488374999099
5.25566283399894
5.259839374999501
5.264012208999702
let value = 5.24731462499949
print(value)
// 5.24731462499949
let valueSignificandRounded = round((1000 * 10) * value.significand) / (1000 * 10)
let valueRounded = CGFloat(sign: v.sign, exponent: v.exponent, significand: valueSignificandRounded)
print(valueRounded)
// 5.2472
Swift 4 Лучший способ
Это то, что помогло мне округлить до 2 знаков после запятой
let val = round(100 * scale) / 100
Округление двойного значения до x десятичных знаков в Swift
вход = 2,99999999 выход = 2,9
вход = 2.0 выход = 2
print(2.9999.roundDecimal(places: 1)) // Будет напечатано "2,9"
print(2.9999.roundDecimal(places: 2)) // Будет напечатано "2,99"
extension Double {
func roundDecimal(places: Int = 2) -> String {
if self == Double(Int(self)) {
return "\(Int(self))"
} else {
let multiplier = pow(10.0, Double(places))
let doubleNumber = self
let integerPart = Int(doubleNumber)
let decimalPart = Int(doubleNumber * multiplier) % Int(multiplier)
let combinedString = "\(integerPart).\(decimalPart)"
return combinedString
}
}
}