在Swift中获取double的小数部分

use*_*713 14 math floating-accuracy swift

我试图在swift中分隔double的十进制和整数部分.我尝试了很多方法,但它们都遇到了同样的问题......

let x:Double = 1234.5678
let n1:Double = x % 1.0           // n1 = 0.567800000000034
let n2:Double = x - 1234.0        // same result
let n3:Double = modf(x, &integer) // same result
Run Code Online (Sandbox Code Playgroud)

有没有办法获得0.5678而不是0.567800000000034而无需将数字转换为字符串?

Nic*_*ico 68

您可以使用truncatingRemainder1作为分隔符.

使用截断除法返回此值的余数除以给定值.

Apple doc

例:

let myDouble1: Double = 12.25
let myDouble2: Double = 12.5
let myDouble3: Double = 12.75

let remainder1 = myDouble1.truncatingRemainder(dividingBy: 1)
let remainder2 = myDouble2.truncatingRemainder(dividingBy: 1)
let remainder3 = myDouble3.truncatingRemainder(dividingBy: 1)

remainder1 -> 0.25
remainder2 -> 0.5
remainder3 -> 0.75
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 20

与 Alessandro Ornano 相同的方法实现为 FloatingPoint 协议的实例属性:

Xcode 11 • Swift 5.1

import Foundation

extension FloatingPoint {
    var whole: Self { modf(self).0 }
    var fraction: Self { modf(self).1 }
}
Run Code Online (Sandbox Code Playgroud)
1.2.whole    // 1
1.2.fraction // 0.2
Run Code Online (Sandbox Code Playgroud)

如果您需要小数数字并保留其精度数字,您将需要使用 SwiftDecimal类型并使用以下方式初始化它String

extension Decimal {
    func rounded(_ roundingMode: NSDecimalNumber.RoundingMode = .bankers) -> Decimal {
        var result = Decimal()
        var number = self
        NSDecimalRound(&result, &number, 0, roundingMode)
        return result
    }
    var whole: Decimal { self < 0 ? rounded(.up) : rounded(.down) }
    var fraction: Decimal { self - whole }
}
Run Code Online (Sandbox Code Playgroud)
let decimal = Decimal(string: "1234.99999999")!  // 1234.99999999
let fractional = decimal.fraction                // 0.99999999
let whole = decimal.whole                        // 1234
let sum = whole + fractional                     // 1234.99999999
Run Code Online (Sandbox Code Playgroud)


Otá*_*udo 13

如果不将其转换为字符串,您可以将这些小数位向上舍入到这样的小数:

let x:Double = 1234.5678
let numberOfPlaces:Double = 4.0
let powerOfTen:Double = pow(10.0, numberOfPlaces)
let targetedDecimalPlaces:Double = round((x % 1.0) * powerOfTen) / powerOfTen
Run Code Online (Sandbox Code Playgroud)

你的输出会是

0.5678

  • 谢谢你的回答.这很好,但不幸的是它对我不起作用,因为我事先并不知道代码中适当数量的位置.我猜我必须通过字符串转换: - / (2认同)

Ale*_*ano 12

斯威夫特2:

您可以使用:

modf(x).1
Run Code Online (Sandbox Code Playgroud)

要么

x % floor(abs(x))
Run Code Online (Sandbox Code Playgroud)


Yod*_*ama 8

斯威夫特 5.1

let x:Double = 1234.5678

let decimalPart:Double = x.truncatingRemainder(dividingBy: 1)    //0.5678
let integerPart:Double = x.rounded(.towardZero)                   //1234
Run Code Online (Sandbox Code Playgroud)

这两个方法都返回 Double 值。

如果你想要一个整数作为整数部分,你可以使用

Int(x)
Run Code Online (Sandbox Code Playgroud)


Ahm*_*mad 5

使用,Float因为它的精确数字比Double

let x:Double = 1234.5678
let n1:Float = Float(x % 1)           // n1 = 0.5678
Run Code Online (Sandbox Code Playgroud)

  • 什么,一个离“0.5678”更远*的值?我对此表示怀疑。 (3认同)