将浮点数或双精度数舍入到小数点后的位数的最佳方法是什么?例如4个小数点:(输入)3.14159265->(输出)3.14162个小数点:0.12345-> 0.12
这是我尝试过的一种方法,似乎有点复杂。
import Darwin
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(3.14159265).rounded(toPlaces: 3)
[这是另一种方法,但是会引发错误“参数标签”(format:,_ :)'与任何可用的重载都不匹配。
let num = 3.14159265
let doubleStr = String(format: "%.2f", num) // "3.14"
我希望有一种更简单(更短)的方法来进行此操作...
我认为这样会很好用
extension Double {
// Rounds the double to decimal places value
func toPrecision(_ points: Int) -> Double {
var factor = 1.0
if points >= 1 {
for i in 1...points {
factor *= 10
}
}
var result = Double(factor * self).rounded() / factor
return result
}
}
取决于您要执行的操作:
如果您只是尝试在用户界面中将数字显示为指定位数,则可以使用NumberFormatter
:
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
let string = formatter.string(for: value)
[它的优点是它可以将字符串表示形式准备为所需的小数位数,但是结果是本地化的(例如,以,
为小数点的德国用户会看到3,14
,而以美国用户为例)会看到3.14
)。这是在用户界面中将数字显示到小数位数的最佳方法,并针对所讨论的设备正确设置其格式。
但是,如果为了进一步计算而试图舍入结果,则可以使用Decimal
:
extension Double {
func rounded(to scale: Int) -> Decimal {
var number = Decimal(self)
var result = Decimal()
NSDecimalRound(&result, &number, scale, .plain)
return result
}
}
例如,如果您要计算某些货币值,然后再进行汇总,则可以使用Decimal
。您仍然会在[UI]中使用NumberFormatter
进行展示(因此很适合您的本地化),但对[R]的四舍五入结果使用Decimal
将消除十进制数字的二进制表示形式。参见What Every Computer Scientist Should Know About Floating-Point Arithmetic。