Это особенности вычислений на бинарных числах с плавающей точкой. В большинстве языков программирования они основаны на стандарте IEEE 754. Числа в JavaScript, double в C++, C# и Java используют 64-битное представление. Источник проблемы кроется в том, что числа выражены через степени двойки. В результате рациональные числа (такие как 0.1, то есть 1∕10), знаменатель которых не является степенью двойки, не могут быть выражены точно.