> 0.1 + 0.2 === 0.3
false

О, сладко бебе Рей... защо ми причиняваш това?

Бях шокиран първия път, когато въведох това изявление в JavaScript конзолата и видях резултата. Защо толкова проста аритметика не дава надежден резултат? Както се оказва, това не е само JavaScript. Повечето съвременни езици за програмиране, включително C, C++, Java, Scala, Ruby, Python и Perl ще върнат false за едно и също сравнение.

Виновникът

Повечето езици за програмиране използват стандарт за представяне на десетични числа като 0,1 като числа с плаваща запетая. Компютрите не работят с числа по същия начин, както ние. Докато ние работим с бройна система с основа 10, компютрите работят с двоична система. Когато разделим 1 на 3 при основа 10 и получим 0,33333, повтарящо се вечно, компютърът се натъква на подобен проблем, когато разделя 1 на 10 при основа 2.

В същото време компютрите трябва да представят числа с ограничено количество памет. Това означава, че някои числа никога не могат да бъдат представени точно. Понякога доброто представяне е достатъчно добро, а останалото е оставено на закръгляване - и със закръгляването идва грешка при закръгляването.

И така, на какво всъщност се равнява 0,1 + 0,2?

> 0.1 + 0.2
0.30000000000000004

Подобен проблем възниква при добавяне на числа в различен ред.

> (0.1 + 0.2) + 0.3 === 0.1 + (0.2 + 0.3)
false

Решението

Като цяло разработчиците просто се справят с това.

Един от начините е да проверите дали разликата между две числа е по-малка от допустимия марж. Ако е така, значи е достатъчно добро и решаваме, че числата всъщност са равни.

Друг е да закръглите числата до някаква конкретна дължина на десетичната дроб, преди да направите сравнението.

Така или иначе, важно е да запомните да внимавате, когато работите с числа с плаваща запетая и това, което виждате, не е непременно това, което ще получите.

За страхотна аналогия на този проблем, написана на обикновен английски, вижте този отговор на Quora.