舍入为指定的十进制Swift的最佳方法

问题描述 投票:-1回答:2

将浮点数或双精度数舍入到小数点后的位数的最佳方法是什么?例如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"

我希望有一种更简单(更短)的方法来进行此操作...

swift floating-point rounding
2个回答
0
投票

双精度扩展为小数点后四舍五入

我认为这样会很好用

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
    }
}

0
投票

取决于您要执行的操作:

  1. 如果您只是尝试在用户界面中将数字显示为指定位数,则可以使用NumberFormatter

    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2
    
    let string = formatter.string(for: value)
    

    [它的优点是它可以将字符串表示形式准备为所需的小数位数,但是结果是本地化的(例如,以,为小数点的德国用户会看到3,14,而以美国用户为例)会看到3.14)。这是在用户界面中将数字显示到小数位数的最佳方法,并针对所讨论的设备正确设置其格式。

  2. 但是,如果为了进一步计算而试图舍入结果,则可以使用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

© www.soinside.com 2019 - 2024. All rights reserved.