Спасибо, что создал JS...
Подробнее
Z typeof NaN <• "number" > 9999999999999999 10000000000000000 > 0.5+0.1==0.6 <• true i 0.1+0.2==0.3 <• false * Math.max() <• -Infinity > Math.min() <• Infinity > []+[] <. 11 11 > []+{} <• "[object Object]" > {)+[] <• 0 > true+true+true===3 <• true £ true==l <• true > true===l <• false > (*+[]+[]+'[]).length <• 9 > 9+"l" <• "91" * 91-"1" <• 90 > []==0 true > true-true <• 0
it-юмор,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,js
Еще на тему
Почему 9+"1" - на выходе строка (или чар?), а 91-"1" - на выходе число?
Что это за шайтанство?
Вообще в двоичном коде дроби записываются иначе чем целые числа. Там они делят число 1
К примеру:
0,1 - это 0.5
0,01 - это 0.25
0,001 - 0.125
0,11 - 0,75
0,011 - 0,375
0,0101 - 0,3125
И т.д.
В общем ты не можешь в двоичном коде поделить 1 так, чтобы получить в итоге ровно 0,3.
Если в кратко то 0.3 = 3 * 10 ^ -1. А при записи числа с плавающей точкой в битовую строку запишется 3 и степень десятки (то есть -1).
А еще JS - это не компилируемый язык, так что все эти рассуждения про двоичный код здесь неуместны. Вся эта ситуация -- косяк интерпретатора
Т.е. полная мантисса (обратите внимание на единичку слева от М) лежит в интервале [1.0; 2.0). И да, это ДВОИЧНАЯ мантисса. И основание степени в числе тоже ДВА.
И теперь внимание вопрос: можно ли представить число 0.3 ТОЧНО в экспоненциальной форме с основанием ДВА? Ответ: нет, нельзя. И это не имеет отношения к джаваскрипту. Это стандарт IEEE 754, который применяется ВЕЗДЕ. Все современные процессоры имеют сопроцессоры для быстрой работы с числами с плавающей запятой (FPU). Все языки оперируют именно такими числами. Это везде. А человек, который создал картинку в посте, - долбоеб, который выучить только шутейки про джаваскрипт, но не знает основ.
И да, это приводит к проблемам. Например, нельзя просто так взять и сравнить два числа с плавающей запятой.
if(a == 0.5) // хер тебе в рыло, сраный урод
Это побитовое сравнение, и требует точного совпадения, которое может быть, а может не быть. Как правильно.
if(abs(a - 0.5)
Но это детский сад по сравнению с проблемой вычислительной устойчивости. Представь, что ты делаешь какие-то расчеты. Это может быть скучное решение уравнений на сраной лабе, расчет напряженности в крыло ебучего самолета или же физический движок твоей любимой игры. И куча методов расчета - итерационные, они считают одну и ту же хуйню стопицот раз, приближаясь к правильному ответу. Но если что-то пошло не так (например, ты дохуя раз прибавляешь очень маленькое число к очень большому), то весь твой расчет может пойти по пизде, дать неверные результаты или НЕ СОЙТИСЬ НАХУЙ! ДА, БЛЯТЬ, ВЗРЫВАЙ ЭТУ ЕБАНУЮ ФИЗИКУ! (Думаю, многие видели, как в разных играх с физикой объекты может распидорасить. Garrys's Mod это любит).
if(abs(a - 0.5)
https://0.30000000000000004.com/
1) Всякие приведения чисел и строк, тем более массивов, булеанов - это, конечно, пиздец.
2) Floating point - это не пиздец, это везде, выше написали уже
3) true == 1 и true === 1 - так в жс специально запилили костыль-оператор "===" для точного сравнения без приведения типов.