使用剩余运算符(Modulo)并转换为Int返回false值

时间:2015-08-06 19:09:37

标签: ios macos swift modulo

我正在玩swift并尝试使用remainder operator (modulo)从数字中检索小数位并来回投射一些值。

以下是一些计算结果:

var doubleVal: Double = 6.2
var intVal: Int = 0

doubleVal = Int(doubleVal % Double(Int(doubleVal)) * 10)
println(doubleVal) // 6.2 % 6.0 => 0.2 * 10 = 2 -> expected result printed

val = 6.6

doubleVal = Int(doubleVal % Double(Int(doubleVal)) * 10)
println(doubleVal) // 6.6 % 6.0 => 0.6 * 10 = 5??? -> unexpected result printed

另外

var val: Double = 6.3
var intVal: Int = 0

intVal = Int(val % Double(Int(val)) * 10)
println(intVal) // 6.3 % 6.0 => 0.3 * 10 = 2??? -> unexpected result printed

var val: Double = 10.3
var intVal: Int = 0

intVal = Int(val % Double(Int(val)) * 10)
println(intVal) // 10.3 % 10.0 => 0.3 * 10 = 3 -> expected result printed

为什么结果彼此差异很大?为什么 6.3 的计算会导致 2 的意外结果,而使用 10.3 会导致 3 的预期结果

编辑:

我已阅读this answer并了解浮点计算。如果您计算(0.1 + 0.2) * 10,那么您将获得3。浮点问题发生在“遥远的”数字中。这就是我至少想到的。

让我们把它分成更小的步骤:

var val = 10.6
println(val % Double(Int(val))) -> 0.6
println(val % Double(Int(val)) * 10) -> 6.0
println(Int(val % Double(Int(val)) * 10)) -> 5

我看到“后面”没有“隐藏”数字,但我仍然得到错误的结果。另一个例子是我在最右边看到一个数字并且在投射时没有错误:

var val = 10.3
println(val % Double(Int(val))) -> 0.300000000000001
println(val % Double(Int(val)) * 10) -> 3.00000000000001
println(Int(val % Double(Int(val)) * 10)) -> 3

1 个答案:

答案 0 :(得分:0)

在这两种情况下,转换为Int之前的结果是“某个数字非常接近3.0”。这个数字可以稍微小一些,稍微大一些,纯粹的巧合就等于3.0。转换为Int会丢弃小数点后的所有内容,因此如果“某些非常接近3.0的数字”恰好是2.9999999999999999,则结果为2;如果碰巧是3.000000000000001那么结果是3.