如何从Double转换为Int?

时间:2019-03-20 06:56:59

标签: swift

假设我有一个Double,并从Int创建了一个Double

var a : Double = 4.0
var b = Int(a)

过去,如果将b=3内部表示为a,则上面的代码可能会导致3.999999999999999。我们在Swift中不必再为此担心吗?将Double转换为Int的正确方法是什么?

3 个答案:

答案 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

为此,您可以将roundedFloatingPointRoundingRule .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