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
您可以使用truncatingRemainder和1作为分隔符.
使用截断除法返回此值的余数除以给定值.
例:
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
Ale*_*ano 12
斯威夫特2:
您可以使用:
modf(x).1
Run Code Online (Sandbox Code Playgroud)
要么
x % floor(abs(x))
Run Code Online (Sandbox Code Playgroud)
斯威夫特 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)
使用,Float因为它的精确数字比Double
let x:Double = 1234.5678
let n1:Float = Float(x % 1) // n1 = 0.5678
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18896 次 |
| 最近记录: |