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

时间:2017-07-04 15:24:13

标签: swift math optimization

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

问题:

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

如何获得整数部分 1234 .56789?

如何获得小数部分1234. 56789

8 个答案:

答案 0 :(得分:32)

你可以做简单的地板和截断:

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

答案 1 :(得分:4)

Swift 4.x完整解决方案: 我也赞扬@Thomas解决方案,我想补充一些东西,使我们能够在2字符串部分中使用分开的部分。 尤其是当我们要为数字的UILabelmain部分使用2个不同的decimal时。

Separated integer and decimal label

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

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

答案 2 :(得分:3)

你可以这样做 - >

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是小数部分。

修改

托马斯回答是你想要的......

答案 3 :(得分:1)

将您的号码转换为字符串,以后将单独的字符串从。

试试这个: -

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 :(得分:0)

无需扩展名。 Swift已经为此内置了功能。

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

答案 5 :(得分:0)

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

    /// 1.0012 --> "0012"
    var fractionPartIntegerString: String {
        return "\(String(self).split(separator: ".")[1])"
    }

}
print(1000.0.integerPart)  // 1000.0
print(1000.0.fractionPart) // 0.0
print(1000.1.integerPart)  // 1000.0
print(1000.2.fractionPart) // 0.2
print(1_000_000_000.1.integerPart) // 1000000000.0
print(100_000_000.13233.fractionPart) // 0.13233

答案 6 :(得分:0)

这绝对会迅速为您带来5/4/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.2

答案 7 :(得分: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 中内置的,我敢肯定甚至更早......