Strange problem comparing floats in objective-C

casting, floating-point, iphone, objective-c

Solution

I believe, having not found the standard that says so, that when comparing a `float` to a `double` the `float` is cast to a `double` before comparing. Floating point numbers without a modifier are considered to be `double` in C.

However, in C there is no exact representation of 0.1 in floats and doubles. Now, using a float gives you a small error. Using a double gives you an even smaller error. The problem now is, that by casting the `float` to a `double` you carry over the bigger of error of the `float`. Of course they aren't gone compare equal now.

Instead of using `(float)0.1` you could use `0.1f` which is a bit nicer to read.

Problem

At some point in an algorithm I need to compare the float value of a property of a class to a float. So I do this: ``` if (self.scroller.currentValue <= 0.1) { } ``` where currentValue is a float property. However, when I have equality and `self.scroller.currentValue = 0.1` the if statement is not fulfilled and the code not executed! I found out that I can fix this by casting 0.1 to float. Like this: ``` if (self.scroller.currentValue <= (float)0.1) { } ``` This works fine. Can anyone explain to my why this is happening? Is 0.1 defined as a double by default or something? Thanks.

Original source