假设我有一个Double
,并从Int
创建了一个Double
:
var a : Double = 4.0
var b = Int(a)
过去,如果将b=3
内部表示为a
,则上面的代码可能会导致3.999999999999999
。我们在Swift中不必再为此担心吗?将Double转换为Int的正确方法是什么?
答案 0 :(得分:1)
您正在使用通用初始化程序init(_:)
,该初始化程序会根据给定的浮点值创建一个整数,并向零舍入。
因此,基于浮点数学运算保存类型存在一个众所周知的问题(请参见this)。因此,您的a
可以保存为3.99999999999999994
。然后,如果您使用此Int
中的此Double
初始化器,它将创建Int
舍入为零...(3
)
一种方法是将Double
的值四舍五入后再将Int
的初始值设定项传递到小数点后一位
round(a*10)/10
然后按照规则舍入结果
>= 0.5 round up
< 0.5 round down
为此,您可以将rounded
与FloatingPointRoundingRule
.toNearestOrAwayFromZero
(此参数的默认值)一起使用
var a: Double = 3.499999999
var b = Int((round(a*10)/10).rounded()) // b = 4
您还可以使用失效的初始化器,因为如果Double
大于Int
,则代码崩溃
var a: Double = .greatestFiniteMagnitude
if var b = Int(exactly: (round(a*10)/10).rounded()) { ... } // nil
答案 1 :(得分:0)
let roundedVal = round(a)
var b = Int(roundedVal)
答案 2 :(得分:0)
在将原型Double.rounded()
投射到Int之前,应该使用它。因此,像3.99999999999...
或4.000000000001
这样的双数将变成4
:
var a : Double = 3.999999999999
var b = Int(a.rounded(.toNearestOrAwayFromZero))
print(Int(a)) // output: 3
print(b) // output: 4