Search the Community
Showing results for tags 'Борьба с багами'.
-
Сегодня затрону важную проблему, о которой не знают многие новички. Это не секретная информация и про это написано достаточно много, но новички так стремятся "в бой", что пропускают кучу важной информации. А потом удивляются, почему программа работает не так, как они хотят. Итак, сегодня рассмотрим две проблемы. A): Подумайте что выведет это код? (не проверяйте через компьютер только) console.log(6.6+3.3); console.log(0.1+0.2); console.log(0.3-0.1); 9.9; 0.3; 0.2? Неправильно! Ответы: 9.899999999999999 0.30000000000000004 0.19999999999999998 Логично, что и (6.6+3.3) === 9.9 будет false Почему так? Прочитайте про IEEE 754 и всё поймёте. Хотите знать как с этим бороться? Хорошо, дам 2 метода. 1): Не используйте операции с десятичными дробями. Храните исключительно целые числа и делайте их дробными прямо перед использованием. 2): Используйте toFixed. Значение 10 решает 99% проблем с дробями (у вас, конечное, будет только 10 знаков после запятой). Значение 5 решает 99.9999% всех проблем с дробями. Короче, чем ближе значение к 0, тем меньше проблем будет у вас с дробями (и тем меньше будет знаков после запятой). console.log(+(6.6+3.3.toFixed(5))); B):Подумайте, что выведет этот код(не проверяйте через компьютер только) console.log(9999999999999999); console.log(279999999999999448); Ответы: 10000000000000000 279999999999999460 Как с этим бороться? Очень просто! Не используйте слишком большие числа. Используйте числа от −2147483648 до 2147483647 и проблем не будет 100% (можно и немного большие/меньшие числа использовать, но и этого диапозона всем хватает обычно). Меня бесят всякие ошибки в вычислениях в JS (их явно больше, чем 2 описанные), что мне делать? Если точные вычисления вам важны, то в JS храните все числа в String типе, а вычисления проводите с помощью плагинов (нормальными статически типизированными языками; Есть куча специальных языков для вычислений). Вот так вот, за все удобства JS приходится платить точностью, но как только появляется точность, то тут же улетучивается всё удобство!