swift 轻松截断双雨燕

3vpjnl9f  于 2023-02-03  发布在  Swift
关注(0)|答案(6)|浏览(140)

我希望能够将经度/纬度值19.3563443转换为19.35634(小数点后五位)。有什么简单的方法可以做到这一点吗?

new9mtju

new9mtju1#

您可以使用NumberFormatter

extension Formatter {
    static let number = NumberFormatter()
}
extension FloatingPoint {
    func fractionDigitsRounded(to digits: Int, roundingMode:  NumberFormatter.RoundingMode = .halfEven) -> String {
        Formatter.number.roundingMode = roundingMode
        Formatter.number.minimumFractionDigits = digits
        Formatter.number.maximumFractionDigits = digits
        return Formatter.number.string(for:  self) ?? ""
    }
}
let value = 19.3563443
let roundedToFive = value.fractionDigitsRounded(to: 5) // "19.35634"
ttygqcqt

ttygqcqt2#

四舍五入,得到双倍的回报。

NSString(format: "%.5f", myfloat).doubleValue

这不会截断,但可能足够准确的长/纬度到5个小数位,是快速的。

t2a7ltrp

t2a7ltrp3#

这是一个数学问题,而不是编码问题。在StringDouble之间转换不是很有吸引力。在数学中,截断小数点右侧的数字称为缩减比例。要截断非整数,您所需要做的就是将小数向右移动,无论您希望它截断多少位(乘以10将其移1,乘以100将其移2,依此类推),将其转换为整数(这将删除新小数点后的所有内容),然后将其除以原始乘数以将小数点返回到其原始位置。
要将pi的比例缩小到3
1.向右移动小数:三点一四一万五千九百二十七 * 十立方=三千一百四十一点五九二七
1.零分数= 3141.0
1.向后移动小数:3141 / 10^3 = 3.141
为方便起见,将其添加为Double的扩展:

extension Double {
    /// Reduces a double's scale (truncates digits right of the decimal).
    func reduceScale(to places: Int) -> Double {
        guard !self.isNaN,
              !self.isInfinite else {
            return 0 // if the double is not a number or infinite, this func will throw an exception error
        }
        let multiplier = pow(10, Double(places))
        let newDecimal = multiplier * self // move the decimal right
        let truncated = Double(Int(newDecimal)) // drop the fraction
        let originalDecimal = truncated / multiplier // move the decimal back
        return originalDecimal
    }
}

let dirty = 3.1415927
let clean = dirty.reduceScale(to: 2) // 3.14
disbfnqx

disbfnqx4#

我建议使用NSDecimalNumber。我不知道这实际上比@列奥纳多的答案更好还是更差。但是当处理数字时,我更喜欢坚持数字,而不是字符串转换。下面的代码生成了一个函数,用于请求的数字位数,可以根据需要重用。
此函数通过向下舍入进行截断。要获得正常的算术舍入,请将其更改为使用.RoundPlain而不是.RoundDown

func makeRounder(#digits: Int16) -> (Double) -> Double {
    class RoundHandler : NSObject, NSDecimalNumberBehaviors {
        var roundToDigits : Int16

        init(roundToDigits: Int16) {
            self.roundToDigits = roundToDigits
        }

        @objc func scale() -> Int16 {
            println("Digits: \(digits)")
            return roundToDigits
        }

        @objc func roundingMode() -> NSRoundingMode {
            return NSRoundingMode.RoundDown
        }

        @objc func exceptionDuringOperation(operation: Selector, error: NSCalculationError, leftOperand: NSDecimalNumber, rightOperand: NSDecimalNumber) -> NSDecimalNumber? {
            return nil
        }
    }

    let roundHandler = RoundHandler(roundToDigits:digits)

    func roundDigits(original:Double) -> Double {
        let decimal = NSDecimalNumber(double: original)
        let rounded = decimal.decimalNumberByRoundingAccordingToBehavior(roundHandler)
        return rounded.doubleValue
    }

    println("Digits: \(digits)")
    return roundDigits
}

let roundTo5 = makeRounder(digits:Int16(5))

roundTo5(19.3563443)
roundTo5(1.23456789)
bq8i3lrv

bq8i3lrv5#

我在另一个网站上找到了不同的答案,想分享一下:

let x = 129.88888888777
   let y =  Double(round(1000*x)/1000)

y returns 129.888
多亏了swift的“round”功能。

6qqygrtg

6qqygrtg6#

令x =(长 *100000).四舍五入(.到零)/100000

相关问题