Ответ Это особенности вычислений на бинарных числах с плавающей точкой. В большинстве языков программирования они основаны на стандарте IEEE 754. Числа в JavaScript, double в C++, C# и Java используют 64-битное представление. Источник проблемы кроется в том, что числа выражены через степени двойки. В результате рациональные числа (такие как 0.1, то есть 1∕10), знаменатель которых не является степенью двойки, не могут быть выражены точно. Число 0.1 в бинарном 64-битном формате выглядит следующим образом: 0.1000000000000000055511151231257827021181583404541015625 как десятичное число, или 0x1.999999999999ap-4 в шестнадцатиричной нотации чисел с плавающей точкой C99. А как рациональное число, то есть 1∕10, может быть записано точно: 0.1 как число в десятичной нотации, или 0x1.99999999999999...p-4 в шестнадцатиричной нотации, где ... — бесконечная последовательность девяток. Константы 0.2 и 0.3 тоже будут выражены приблизительно. Ближайшее к 0.2 бинарное число с плавающей точкой будет немного больше, чем рациональное число 0.2, а ближайшее к 0.3 — немного меньше. В результате сумма 0.1 и 0.2 оказывается больше, чем 0.3, и равенство оказывается неверным. Обычно для сравнения чисел с плавающей точкой задают некоторое малое число epsilon и сравнивают с ним модуль разницы между числами: abs(a - b) < epsilon. Если неравенство верно, то числа a и b примерно равны. При последовательных вычислениях ошибка накапливается. Часто от порядка вычислений зависит точность результата. Нет единого универсального epsilon, который подходил бы для всех случаев. Для вычислений с деньгами следует использовать специальные типы чисел, основанные на десятичной системе, если они доступны, например, Decimal в C#, BigDecimal в Java и т.п. Они используют десятичное внутреннее представление, что позволяет работать с числами вроде 29.99 без округления. Правда вычисления на них гораздо медленее. Рекомендуется к прочтению: What Every Computer Scientist Should Know About Floating-Point Arithmetic — очень подробное объяснение. floating-point-gui.de — более краткое объяснение.