Сравнение с плавающей запятой Javascript

У меня большая проблема с сопоставлением чисел в javascript.

script обвиняет, что сравнение "7 < 10" является ложным.

console.clear();

var min = parseFloat("5").toFixed(2);
var max = parseFloat("10").toFixed(2);
var value = parseFloat("7").toFixed(2);

console.log(min, max, value);

console.log(value > min); // OK.
console.log(value < max); // ---- false ??????

Кто-нибудь знает, что такое happing?

Ответ 1

Как выясняется .toFixed() возвращает строки. Попробуйте добавить parseFloat перед сравнением значений, чтобы увидеть результат:

console.log(parseFloat(value) < parseFloat(max)); // ---- now true

Ответ 2

Вы должны всегда округлять числа с плавающей точкой, иначе вы получите странные результаты в некоторых случаях.

Попробуйте это, чтобы увидеть проблему: console.log(parseFloat(6760/100*100));

С округлением вы получите правильные результаты:

console.log(Math.round(parseFloat(value)*100000) < Math.round(parseFloat(max)*100000));

Или вы можете попробовать что-то вроде: http://mikemcl.github.io/decimal.js/

Числа с плавающей точкой не являются точными числами, они являются точным представлением чисел.

Это на самом деле довольно просто. Когда у вас есть система 10 Base (как наш), он может выражать только дроби, которые используют главный фактор база. Основными факторами 10 являются 2 и 5. Таким образом, 1/2, 1/4, 1/5, 1/8 и 1/10 все можно выразить чисто, потому что все знаменатели используют простые коэффициенты 10. Напротив, 1/3, 1/6 и 1/7 все повторяются десятичные дроби, потому что их знаменатели используют главный фактор 3 или 7. В двоичный (или основание 2), единственный простой фактор равен 2. Таким образом, вы можете только четко выразить дроби, которые содержат только 2 как главный фактор. В двоичные, 1/2, 1/4, 1/8 все будут четко выражены в виде десятичных дробей. В то время как 1/5 или 1/10 будет повторять десятичные дроби. Так 0,1 и 0,2 (1/10 и 1/5) в то время как чистые десятичные дроби в системе 10 оснований повторяются десятичных знаков в системе base 2, в которой работает компьютер. Когда вы посчитайте эти повторяющиеся десятичные дроби, в итоге вы получите остатки которые переносятся при конвертации базы компьютера 2 (бинарный) номер в более удобочитаемую базу 10 числа. Источник


Это не проблема JavaScript. Это происходит потому, что компьютер действительно понимает только 1 и 0.

Если вы хотите углубиться в тему, я предлагаю это в качестве отправной точки: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html