我正在玩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
答案 0 :(得分:0)
在这两种情况下,转换为Int之前的结果是“某个数字非常接近3.0”。这个数字可以稍微小一些,稍微大一些,纯粹的巧合就等于3.0。转换为Int会丢弃小数点后的所有内容,因此如果“某些非常接近3.0的数字”恰好是2.9999999999999999,则结果为2;如果碰巧是3.000000000000001那么结果是3.