Swift中的浮点到整数转换失败
我正试图找到一种可靠的方法,在Swift中将Swift中的浮点到整数转换失败,swift,math,swift2,integer-arithmetic,Swift,Math,Swift2,Integer Arithmetic,我正试图找到一种可靠的方法,在Swift中将浮点或双精度转换为Int。当出现溢出时,我会遇到问题 让我们以下面的例子为例: let double = 9223372036854775807.0 // This is 2^63 - 1 (aka Int.max on 64 bits architecture) print("Int.max is : \(Int.max)") print(String(format: "double value is : %f", doubl
浮点
或双精度
转换为Int
。当出现溢出时,我会遇到问题
让我们以下面的例子为例:
let double = 9223372036854775807.0 // This is 2^63 - 1 (aka Int.max on 64 bits architecture)
print("Int.max is : \(Int.max)")
print(String(format: "double value is : %f", double))
print(String(format: "Double(Int.max) is : %f", Double(Int.max)))
let int: Int
if (double >= Double(Int.max)) {
print("Warning : double is too big for int !")
int = Int.max
} else {
int = Int(double)
}
其中打印:
Int.max is : 9223372036854775807
double value is : 9223372036854775808.000000
Double(Int.max) is : 9223372036854775808.000000
Warning : double is too big for int !
这种方法非常麻烦。此外,您可能注意到我测试double>=double(Int.max)
,而不是double>double(Int.max)
。这是因为由于四舍五入,Double(Int.max)
实际上等于Int.max+1
。对于32位体系结构,我的代码可能必须有所不同
那么还有别的办法吗?就像我会错过的一个可失败的初始值设定项,或者一种更好的、可移植的方法?您可以通过为
Double
创建自己的可失败初始值设定项来扩展Int
:
extension Int {
init?(double: Double) {
if double >= Double(Int.max) || double < Double(Int.min) || double.isNaN || double.isInfinite {
return nil
} else {
self = Int(double)
}
}
}
if let i = Int(double: 17) {
print(i)
} else {
print("nil")
}
// It also handles NaN and Infinite
let nan = sqrt(-1.0)
let inf = 1e1000
Int(double: nan) // nil
Int(double: inf) // nil
extension Int{
初始化?(双精度:双精度){
如果double>=double(Int.max)| double
我只是在评论关于这个问题的另一个帖子。我希望你能向苹果公司提交一份缺陷报告。奇怪的是,我们在Int算术中使用了溢出运算符,但在这种情况下,我们得到的只是一个致命的错误。快速的数字运算很糟糕,这只是可怕的一部分…谢谢。我希望编译器能够优化内置的东西,但我想目前还没有(我也没有在Swift 3中看到任何东西…)。此外,我不确定这是否会像预期的那样适用于NaN和infinity。更新了NaN和infinity的答案。