Discuss Scratch

BraveCobra12
Scratcher
14 posts

Math

Scratch says 100-99.1 is something like 0.9000000000000000007
Flowermanvista
Scratcher
1000+ posts

Math

Not a bug. This is a natural property of a type of number called a double-precision floating-point number (also called double float or just double), which is the primary (and for a long time, the only) type of number in JavaScript, the language in which Scratch is written. The site 0.30000000000000004.com gives what I think is a pretty good explanation of this phenomenon:

0.30000000000000004.com wrote:

Floating Point Math

Your language isn't broken, it's doing floating point math. Computers can only natively store integers, so they need some way of representing decimal numbers. This representation comes with some degree of inaccuracy. That's why, more often than not, .1 + .2 != .3.

Why does this happen?

It's actually rather interesting. When you have a base 10 system (like ours), it can only express fractions that use a prime factor of the base. The prime factors of 10 are 2 and 5. So 1/2, 1/4, 1/5, 1/8, and 1/10 can all be expressed cleanly because the denominators all use prime factors of 10. In contrast, 1/3, 1/6, and 1/7 are all repeating decimals because their denominators use a prime factor of 3 or 7. In binary (or base 2), the only prime factor is 2. So you can only express fractions cleanly which only contain 2 as a prime factor. In binary, 1/2, 1/4, 1/8 would all be expressed cleanly as decimals. While, 1/5 or 1/10 would be repeating decimals. So 0.1 and 0.2 (1/10 and 1/5) while clean decimals in a base 10 system, are repeating decimals in the base 2 system the computer is operating in. When you do math on these repeating decimals, you end up with leftovers which carry over when you convert the computer's base 2 (binary) number into a more human readable base 10 number.
(Note that the following is my signature - it appears automatically below all of my posts. You can tell where a post ends and where a signature starts because there is a grey line separating them. You can put anything you want in a signature - including advertisements for your projects or forum topics. To get your own signature, follow the instructions here.)

Powered by DjangoBB