利用Swift 5,根据您的需要,您可以选择以下9种风格之一,以使从Double
获得圆角结果。
#1.使用FloatingPoint
rounded()
方法
在最简单的情况下,您可以使用Double
rounded()
方法。
let roundedValue1 = (0.6844 * 1000).rounded() / 1000
let roundedValue2 = (0.6849 * 1000).rounded() / 1000
print(roundedValue1)
print(roundedValue2)
#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. 使用 Darwin 的 round
函数
Foundation 通过 Darwin 提供了一个 round
函数。
import Foundation
let roundedValue1 = round(0.6844 * 1000) / 1000
let roundedValue2 = round(0.6849 * 1000) / 1000
print(roundedValue1)
print(roundedValue2)
#4. 使用由 Darwin 的 round 和 pow 函数构建的 Double 扩展自定义方法
如果您需要多次重复执行先前的操作,重构代码可能是一个不错的选择。
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)
print(roundedValue2)
如果需要,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)
print(roundedValue2)
#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)
print(roundedValue2)
如果你想要从你的四舍五入操作返回一个 NSString
,使用 NSString
的初始化器是一个简单而有效的解决方案。
import Foundation
let roundedValue1 = NSString(format: "%.3f", 0.6844)
let roundedValue2 = NSString(format: "%.3f", 0.6849)
print(roundedValue1)
print(roundedValue2)
Swift的 String
类型是与 Foundation 的 NSString
类相桥接的。因此,您可以使用以下代码来从您的舍入操作中返回一个 String
:
import Foundation
let roundedValue1 = String(format: "%.3f", 0.6844)
let roundedValue2 = String(format: "%.3f", 0.6849)
print(roundedValue1)
print(roundedValue2)
如果您希望从舍入操作中获取一个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))
print(String(describing: roundedValue2))
round(_:)
、Double
round()
、NSString
初始化器、String
初始化器、NumberFormatter
、Double扩展甚至NSDecimalNumber
和Decimal
舍入双精度的多达9种不同的方法。 - Imanou Petit