var number:Float=123___0000.3

print (number-1)

/* It prints 1229999.2 WHY .3 gets converted into .2?

.7 also gets converted to .8

Whereas .1 .2 .4 .5 .6 .8 .9 all remains same */

You have encountered floating-point rounding.

`Float`

is a single-precision floating-point number (and `Double`

is a double-precision one) obeying the IEEE 754 standard.

`Float`

is represented as a 32-bit value: 1 sign bit, 8 exponent bits to specify the binade (essentially the order of magnitude), and 23 significand (aka mantissa) bits to represent the value within that binade.

The significand stores a fixed number of significant digits (in binary), and the last of these bits (the unit in the last place) represents the smallest difference between two numbers that a `Float`

in a given binade can distinguish between.

Essentially, a floating-point number is always rounded to a fixed number of binary digits, and those are the only numbers which can be exactly represented as a `Float`

. If you try to store a number which cannot be represented exactly as a `Float`

, the number will be rounded to the nearest representable value.

There is a substantial amount of literature available describing floating-point rounding in great detail, including common mistakes, best practices, and strange edge-cases. This is a deep and nuanced area, and if you will be working with floating-point numbers I strongly encourage you to start reading about how rounding works for them.

Nevin wrote:

There is a substantial amount of literature available describing

floating-point rounding in great detail, including common mistakes,

best practices, and strange edge-cases.

Indeed. For some links to specific resources, check out this DevForums post.

Share and Enjoy

Quinn “The Eskimo!” @ DTS @ Apple