如何在Swift中获取数字的整数部分和小数部分

问题描述 投票:0回答:8

这是一个超级基本的问题,但是,我似乎无法在 Swift 中找到答案。

问题:

如何在 Swift 2 和 Swift 3 中获取数字的整个整数部分和小数部分(分别位于小数点左侧和右侧)?例如,对于数字 1234.56789 —

如何获得整数部分1234.56789?

如何获得小数部分 1234.56789

swift math optimization
8个回答
49
投票

您可以进行简单的取整和截断:

let value = 1234.56789
let double = floor(value) // 1234.0
let integer = Int(double) // 1234
let decimal = value.truncatingRemainder(dividingBy: 1) // 0.56789

15
投票

无需扩展。 Swift 已经为此内置了函数。

let aNumber = modf(3.12345)
aNumber.0 // 3.0
aNumber.1 // 0.12345

13
投票

Swift 4.xm、5.x 完整解决方案: 我相信@Thomas 解决方案,我还想添加一些东西,使我们能够在 2 个字符串部分中使用单独的部分。 特别是当我们想要使用 2 个不同的

UILabel
来表示数字的
main
decimal
部分时。

Separated integer and decimal label

下面的扩展也是管理小数部分的数量。我认为这可能有用。

更新:现在,它也可以完美地处理负数!

public extension Double{
func integerPart()->String{
    let result = floor(abs(self)).description.dropLast(2).description
    let plusMinus = self < 0 ? "-" : ""
    return  plusMinus + result
}
func fractionalPart(_ withDecimalQty:Int = 2)->String{
    let valDecimal = self.truncatingRemainder(dividingBy: 1)
    let formatted = String(format: "%.\(withDecimalQty)f", valDecimal)
    let dropQuantity = self < 0 ? 3:2
    return formatted.dropFirst(dropQuantity).description
}

5
投票

稍后将您的数字转换为字符串,将字符串与 .

试试这个:-

let number:Float = 123.46789
let numberString = String(number)
let numberComponent = numberString.components(separatedBy :".")
let integerNumber = Int(numberComponent [0])
let fractionalNumber = Int(numberComponent [1])

4
投票

你可以这样做->

let x:Double = 1234.5678
let y:Double = Double(Int(x))
let z:Double = x - Double(Int(x))
print("\(x) \(y) \(z)")

其中 x 是您的原始值。 y 是整数部分,z 是小数部分。

编辑

托马斯的答案就是你想要的......


2
投票

这在 swift 5 和 4 中肯定对你有用

let number = 3.145443
let integerValue = String(format: "%.0f", number)
let integerValue1 = String(format: "%.1f", number)
let integerValue2 = String(format: "%.2f", number)
print(integerValue)
print(integerValue1)
print(integerValue2)

//Output
3
3.1
3.14

2
投票

modf() 不适用于数字 > 10 亿

@Trevor 的行为类似于 modf()

@Andres Cedronius 示例的行为也类似于 modf()(我尝试修改它)

@Irshad Ahmed 解决方案很好

有一些方便的转换

需要更多控制?查看 https://developer.apple.com/documentation/foundation/numberformatter

extension Double {
    
    /// 1.00234 -> 1.0
    var integerPart: Double {
        return Double(Int(self))
    }
    
    /// 1.0012 --> 0.0012
    var fractionPart: Double {
        let fractionStr = "0.\(String(self).split(separator: ".")[1])"
        return Double(fractionStr)!
    }
    
    /// 1.0012 --> "0.0012"
    var fractionPartString: String {
        return "0.\(String(self).split(separator: ".")[1])"
    }
    
    /// 1.0012 --> 12
    var fractionPartInteger: Int {
        let fractionStr = "\(String(self).split(separator: ".")[1])"
        return Int(fractionStr)!
    }
}

0
投票
var specimen0:Double = 1234.56789

var significant0 = Double.IntegerLiteralType(specimen0) // result is an integer
var fractionals0 = specimen0 - Double(significant0)


var specimen1:Float = -1234.56789

var significant1 = Float.IntegerLiteralType(specimen1) // result is an integer
var fractionals1 = specimen1 - Float(significant1)


var specimen2:CGFloat = -1234.56789

var significant2 = CGFloat.IntegerLiteralType(specimen2) // result is an integer
var fractionals2 = specimen2 - CGFloat(significant2)

这些都是从 Swift 5.3 开始内置的,我确信甚至更早......

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