I'm playing around in swift and trying to retrieve fractional digits from numbers using the remainder operator (modulo) and casting some values back and forth.
So here are some calculated results:
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
Also
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
Why do the results differ so much from each other? Why does the calculation with 6.3 lead to the unexpected result of 2, while using 10.3 leads to the expected result of 3?
Edit:
I've read this answer and know about the floating point calculations. If you calculate (0.1 + 0.2) * 10
however you'll get 3
. Floating point problems happen in "distant" digits. That's what I thought at least.
Let's break it into smaller steps:
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
I see no "hidden" digits in the "back" but I still get the wrong result. Here another example were I see a digit on the far right and get no error while casting:
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