Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的浮点到整数转换失败_Swift_Math_Swift2_Integer Arithmetic - Fatal编程技术网

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

我正试图找到一种可靠的方法,在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", 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的答案。