Swift 5 ile ihtiyaçlarınıza göre yuvarlatılmış bir sonuç elde etmek için aşağıdaki 9 stilden birini seçebilirsiniz Double
.
# 1. FloatingPoint
rounded()
Yöntemi kullanarak
En basit durumda, Double
rounded()
yöntemi kullanabilirsiniz .
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(_:)
Yöntemi kullanarak
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.. Darwin round
fonksiyonunu kullanma
Vakıf, round
Darwin aracılığıyla bir işlev sunar .
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
ve pow
fonksiyonları ile oluşturulmuş özel bir uzatma yöntemi kullanmak
Önceki işlemi birçok kez tekrarlamak isterseniz, kodunuzu yeniden düzenlemek iyi bir fikir olabilir.
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
Gerekirse, NSDecimalNumber
ondalık sayıları yuvarlamak için ayrıntılı ancak güçlü bir çözüm sunar.
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
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
NSString
Yuvarlama işleminizden bir geri dönmek istiyorsanız , NSString
başlatıcı kullanmak basit ama etkili bir çözümdür.
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
Swift'in String
türü Vakıf'ın NSString
sınıfıyla doludur . Bu nedenle, String
yuvarlama işleminizden bir geri dönmek için aşağıdaki kodu kullanabilirsiniz :
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
String?
Yuvarlama işleminizden bir almayı bekliyorsanız , NumberFormatter
son derece özelleştirilebilir bir çözüm sunar.
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")
round(_:)
,Double
round()
,NSString
başlatıcı,String
başlatıcı,NumberFormatter
Çift uzantısı hattaNSDecimalNumber
veDecimal
.