Dimitris Dimitris - 10 months ago 42
Objective-C Question

Strange problem comparing floats in objective-C

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?


Answer Source

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.