JSFiddle - React, Tailwind, and code Playground

by Alexander

JavaScript

console.clear();
var i;
/* Результат смотрим в консоли (F12 или Ctrl+Shift+I) */


// Проблемы хранения чисел, которые нельзя представить в виде какой-то отрицательной степени 2. (например, 0.3). Эти проблемы не только в JS, но во многих других языках.
console.log(0.1 + 0.1 === 0.2); // true
console.log(0.1 + 0.2 === 0.3); // false
console.log(0.1 + 0.3 === 0.4); // true
console.log(0.1 + 0.7 === 0.8); // false
console.log(0.1 + 0.9 === 1);   // true
console.log(0.1 + 1 - 1 === 0.1); // false

/*--------------------------------------------------*/console.warn('====');

// Как решить эту проблему?
// это пример решения таких задач, но не готовое решение
function sum(a) {
    return function(b){
        return (a*10 + b*10) /10
    }
}
console.log( sum(0.1)(0.2) === 0.3 ); //true
console.log( sum(0.1)(0.7) === 0.8); // true

/*--------------------------------------------------*/console.warn('====');

i = 111111111111111111111;
console.log(i); // 111111111111111110000 
console.log(i + 1 === i);
console.log(i - 1 === i);
/*
Но как?
Связано с внутренним представлением чисел в JavaScript. Начиная с некоторого числа, JavaScript может хранить только каждое второе, потом каждое четвертое и т.д, таким образом показывая ближайшее к заданному.
*/

/*--------------------------------------------------*/console.warn('====');

i = 9809987889988769;
console.log(i); // 9809987889988768
console.log(i + 1 === i);
console.log(i - 1 === i);
/*
Числа в JavaScript представимы в виде
[бит знака] x [мантисса] x [2 ^ степень двойки]
Мантисса состоит из 53-битного числа
Начиная с некоторого числа, JS может представлять числа, следующие через двойку (как в примере)
*/

/*--------------------------------------------------*/console.warn('====');
// Что получится?
console.log(parseInt("10765432100123456789"));
/*
64-битное число будет округлено. Чтобы сохранить его значение, нужно работать с ним как со строкой!
*/

/*--------------------------------------------------*/console.warn('====');
//...