【发布时间】:2017-04-30 12:57:54
【问题描述】:
我观察到一些非常奇怪的事情。如果你在 Swift 中运行这段代码:
Int(Float(Int.max))
它崩溃并显示错误消息:
致命错误:浮点值无法转换为 Int,因为结果会大于 Int.max
这真的很违反直觉,所以我将表达式扩展为 3 行,并尝试查看操场上的每一步会发生什么:
let a = Int.max
let b = Float(a)
let c = Int(b)
它崩溃并显示相同的消息。这一次,我看到a 是 9223372036854775807 而b 是 9.223372e+18。很明显a 比b 大36854775807。我也知道浮点数是不准确的,所以我预计小于Int.max,最后几位为0。
我也用Double 试过这个,它也崩溃了。
然后我想,也许这就是浮点数的行为方式,所以我在 Java 中测试了同样的东西:
long a = Long.MAX_VALUE;
float b = (float)a;
long c = (long)b;
System.out.println(c);
它打印出预期的 9223372036854775807!
swift 有什么问题?
【问题讨论】:
-
Java 只是在 Double/Float 到 long 转换中截断,例如
(long)(1.0E100)的计算结果也为 9223372036854775807。
标签: swift floating-point type-conversion