Float
またはDouble
をSwiftのInt
に変換する信頼できる方法を見つけようとしています。私は、オーバーフローが発生したときに問題にぶつかります。 SwiftのFloatingから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ビットアーキテクチャでは異なるはずです。
別の方法がありますか?私が見逃していたか、より良い、移植可能な方法でこれを行うには、failableイニシャライザのように?
。 Appleにバグレポートを提出していただければ幸いです。私たちがInt演算のためにオーバーフロー演算子を持つ方法は変ですが、この状況では致命的なエラーになります。迅速な数値はひどく、これはひどいことの一部です... – matt