0.1 + 0.2 !== 0.3 это следствие того как раз что JS вполне точно ведет себя с float'ами! и именно так ведет себя с ними процессор! Не знаю какие языки это автоматически пытаются исправить, потому что именно так корректно. Дело в том, что литералы 0.1 и 0.2 написанные в соурсе даже не попадают в таком виде в рантайм, еще на стадии компиляции ими инициализируются float переменные. И т.к. ни одно из этих чисел не имеет конечного представления в степени 2ки (это легко проверяется многократным умножением на 2 - дробная часть всегда остается, а значит и биты разрядов после запятой зациклены) из-за этого они не представимы точно и на самом деле вводя так float'ы вы на самом деле вводите 0.10000000000000001 + 0.20000000000000002 в итоге получается 0.30000000000000004 потому у 0.2 старший единичный бит несет =0.125, тогда как у 0.1 это =0.0625 и это означает, что у числа 0.20000000000000002 на самом деле нет возможности прибавить единичную долю в последний разряд. Т.к. на битовом уровне там не хватает значащих бит, из-за того что на один больше в старшем разряде задействовано) Потому при сложении таких чисел этот единичный разряд округляется в большую сторону по правилу ближайшего среднего (в двоичной системе 1 - это половинная граница, так же как и 5 в 10ой) В float'ах всегда такое происходит. И JS в этом не уникален. Напротив это четко соответствует стандарту. (Любой сишник вам скажет, что под float общепринято подразумевать DoublePrecission, если не указанно иное) Языки вроде Питона не имеют такой "ошибки" лишь потому что они реализуют вообще не DoublePrecission, там вообще длинная арифметика - но она не ускоряется процессором, потому считать на питоне дорого. (любая неаккуратная операция превращается во множество операций) - т.е. на более глубоком рассмотрении проясняется что если 0.1 + 0.2 не будет давать 0.30000000000000004 - Это ошибка. Вместо автоматического приведения точности в JS'е позаботились и из коробки дали методы .toFixed developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed .toPrecision developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision Если разобраться с ними станет ясно почему это нельзя делать автоматически без потерь точности. Потому что то хотите верьте хотите проверьте, из того что могут содержать в себе float'ы, вы на самом деле вводите это: 0.1.toPrecision(100) = 0.1000000000000000055511151231257827021181583404541015625 0.2.toPrecision(100) = 0.200000000000000011102230246251565404236316680908203125 Простое решение использовать конструкцию: +(a+b).toPrecision(15) при каждом переводе числа в 10ую систему !!! которое конечно происходит когда вы преобразуете его в строку !!! Без претензий к Владилену. Пояснение этих фактов бы точно сбило с толку всех осваивающих сабж Юнит Тест. Потому видео курс снимает он, а я пишу этот комментарий, так сказать факультативная инфо =)
Раз уж подняли в топ, порылся еще: Как вы понимаете, если ошибку округления повторить в цикле миллион раз, то в худшем случае она будет в миллион раз больше, т.е. применительно к данному примеру останется 5 символов после запятой... (на практике отклонение нормально распределено, но нам однажды осваивать космос) Потому есть лекарство. Алгоритм Кэхэна (компенсационное суммирование) исправляющий ошибку округления при многократном сложении. Он оригинален тем, что для компенсирования ошибки округления он использует ее саму! Обычно такое пригождается на сях, но я переделал в однострочный хелпер на JS /** @return [коррекция, сумма]:number[] - двусоставный float * @param прибавляемое:number - маленькое float (что может потеряться при сумме) * @param [коррекция, сумма]:number[] - двусоставный float */ var kahanSum=(add,[surplus,sum])=>[-sum+(sum+=add-=surplus)-add,sum] //test('Cложение Number.MAX_SAFE_INTEGER миллион раз с одной миллионной долей', () => { let surplus_sum = [0,Number.MAX_SAFE_INTEGER]; for(let n = 1000000; n--;) surplus_sum = kahanSum(0.000001, surplus_sum); console.log( surplus_sum = kahanSum(-Number.MAX_SAFE_INTEGER, surplus_sum) ) // expect(surplus_sum.pop()).toBe(1); // разность должна составить 1 т.к. миллион * милионных долей это = 1 // несмотря на то что даже +0.1 не может сохраниться в float если там уже MAX_SAFE_INTEGER // ошибка компенсатора увы тоже может копится, но прийдется "переполниться дважды" //}) // Чисто алгебраически, surplus член всегда должен бы равняться нулю. Берегитесь слишком оптимизирующих оптимизаторов! // Работает с высокой точностью до тех пор, пока add находиться в пределах ошибки излишка, // потому предпочтительно упорядочить слогаемые по убыванию их абсолютной величины // тест запускабелен в голой консоли см. ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%8D%D1%85%D1%8D%D0%BD%D0%B0#:~:text=%D0%92%20%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B5%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D0%9A%D1%8D%D1%85%D1%8D%D0%BD%D0%B0,%D0%BF%D0%BE%20%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8E%20%D1%81%20%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%BC%20%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D0%BE%D0%BC.
@@ЕвгенийПеревалов-ч1т странно что я такого делаю, но этот вопрос в той или иной форме последнее время зачастил... Но ваша форма получилась самой символичной, технорелигия и все такое... На самом деле просто долго живу, не останавливаясь в познании
Владилен, у меня есть 1 вопрос к твоему курсу. возможно ли с тобой связаться по средствам мессенджеров и задать 2 вопроса, и украсть буквально 2 минуты твоего времени
Скажи пожалуйста что за расширение у тебя в редакторе (которое при вызове функции пишет переменные (a: 41, b: 1"), или обозначает функцию(fn: ()=>{})....??? Есть ли такое для редактора "VS code"??? Может кто знает...? Спасибо за годный контент :) Лучший*
Зашёл под одной учеткой - поставил лайк, колокольчик... Вышел, зашёл под второй учеткой - поставил лайк и колокол соответственно. Вышел, зашёл под третьей учеткой - посмотрел видео и проделал все остальное) Спасибо за ваш труд!
спасибо всем кто делает видеоуроки, вы делаете мир проще =) не знаю тут оптимизирует ли по словам)) javascript, nodejs, unit test, юнит тестирование, видео урок
Лучший урок по jest, который я встречал на Ютубе! Очень помог. Ещё я бы добавил такие базовые вещи, как: 1) возможность употреблять функцию `it` вместо `test`; 2) аргумент `done` коллбэка функции `test` / `it`; 3) функция expect.assertions. P.S. 1:23:50 Здесь замоканный респонс нужно обернуть в Promise.resolve: `axios.get.mockReturnValue(Promise.resolve(response))`, так как в оригинальном методе аксиоса возврается именно промис. А на видео нет ошибки только потому, что в функции Ajax.get (файл async.js) используется асинхронная функция (`await` умеет обрабатывать и данные, не обёрнутые в промисы). А если использовать `Promise.prototype.then`, то при условии, если возвращается не промис, будет ошибка "TypeError: axios.get(...).then is not a function".
Это лучшее, что можно найти на просторах русскоязычного интернета. Очень хочется больше новых видео! Приятно смотреть, слушать и учиться! Спасибо большое, Владилен!
Спасибо! Очень круто объяснил. 42:37 не обязательно глобально ставить Jest, можно просто вызвать его через ./node_modules/.bin/jest, так как он уже установлен локально
Спасибо за актуальный для меня контент! Я подсел на ваши курсы почти с самого начала канала) Вы сильно выделяетесь среди современных блогеров-преподавателей. Больших вам успехов как коммерческих так и профессиональных!
Спасибо за видео! Всё по полочкам и без лишнего мусора. До этого кучу материала прочитал, а в голове только увеличивалась каша. Теперь вроде появился небольшой порядок. И отдельно понравились реализации встроенных функций, реально помогает лучше понимать устройство js.
Поставил лайк, пишу комментарий, подписываться ещё не спешу, но возможно в будущем, а колокольчик не нашёл. За видео спасибо. Очень познавательно и интересно.
Очень бы хотелось увидеть остальные виды тестирования, я как тестировщик очень заинтересован!!! Буду ждать видео! Лучший контент по JS , приятно смотреть твой контент.
Я как всегда, после твоих видео обалдел, как все несложно, ты как всегда на высоте. И число 42 на месте)) Все как обычно, по фэншую Спасибо, Владилен, огромное
Флаг и есть минус родной)) Часто в твоих роликах слышу: флаг минус д))) флаг д) Спасибо, так помогаешь в развитии со своими роликами, продолжай в том же духе
Так структурировано, развернуто, доходчиво и главное интересно никто на просторах ютуба не делает, просто душевное спасибо. Отдельно радуют комментарии под роликом, ни одного не увидел с непонятным куском кода и вопросом почему не работает, за это и аудитории спасибо)
Очень отличная тема ) Спасибо ) Было бы замечательно если бы ты рассмотрел тестирование в связке Jest с react testing library. И е2е на примере Cypress. Буду чрезмерно благодарен )
@@dreamer_vi905 почему спрашиваю, пришло время учить тестирование, а видео вышло 3 года назад, вот и думаю, стоит ли смотреть, или по доке учить. Спасибо за ответ)
Спасибо за ролик. Теперь для многих Unit Тестирование при помощи Jest в Javascript выглядит не таким страшным. С нетерпением ждем ролики по интеграционному и e2e-тестированию.
Спасибо за урок. Ждем другие темы по тестированию. В крупных проектах много времени уделяется тестированию. Ждем другие видео и ожидаем там слова, "теперь пишем тесты, кто еще не в курсе смотрите мои уроки на канале".
Демон, как ты это делаешь ? Я только подумал о тестировании... И так уже не первый раз с твоими видосами ! ;) Спасибо большое ) пойду самовар ставить и в бой =D
Команда - нпм инстОл. Тулза для тестирования моЧа, правильно звучит - мока. мЭтчеры, от слова мАтч) Иногда как произнесешь, немного испанский стыд вызывает)) А вообще, спасибо за труды, недавно натолкнулся на канал, в предверии смены проекта - пригодились некоторые темы для закрепления знаний или даже узнать что-то новое узнать.
Спасибо за видео. Есть вопросы: 1. Возможно ли сконфигурировать так, чтобы если некоторый тест не проходит - останавливалось дальнейшее тестирование 2. возможно ли отметить некоторые тесты типа "нереализовано". Чтобы они не выполнялись, но в то же время отмечались красным (чтобы не тратить время на запуск нереализованного функционала при разработки через тесты)
Привет Владилен, было бы интересно посмотреть как ты используешь Angular Material Table + удалённую сортировку по столбцам и другие фичи для таблиц в Ангуляре.