анализировать
JavaScript имеет только один номер типа номера, и все числа в JavaScript представлены в стандартном формате IEEE-754. Точная проблема чисел с плавающей точкой не является уникальной для JavaScript, потому что некоторые десятичные десятичные знаки представляют бесконечные цифры в двоичном языке:
Десятичный бинар
0,1 0,0001 1001 1001 1001 ...
0,2 0,0011 0011 0011 0011 ...
0,3 0,0100 1100 1100 1100 ...
0,4 0,0110 0110 0110 0110 ...
0,5 0,1
0,6 0,1001 1001 1001 1001 ...
Так, например, 1.1, его программа не может представлять «1.1», но может достичь только определенной степени точности.
1.0999999999999999999
Проблема в JavaScript более сложна, здесь только некоторые тестовые данные в Chrome:
Ввод и вывод
1,0-0,9 == 0,1 Неверно
1,0-0,8 == 0,2 ложного
1,0-0,7 == 0,3 ложь
1,0-0,6 == 0,4 TRUE
1,0-0,5 == 0,5 TRUE
1,0-0,4 == 0,6 Верно
1,0-0,3 == 0,7 Верно
1,0-0,2 == 0,8 TRUE
1,0-0,1 == 0,9 TRUE
решать
Так как же избежать этого типа проблем, не являющейся буркой с 1,0-0,9! = 0,1? Вот решение, которое в настоящее время используется чаще.
Кода -копия выглядит следующим образом:
(1.0-0.9) .tofixed (цифры) // tofixed () Параметры точности должны быть между 0 и 20
parsefloat ((1,0-0,9) .tofixed (10)) === 0,1 // Результат верно
parsefloat ((1,0-0,8) .tofixed (10)) === 0,2 // Результат верно
parsefloat ((1,0-0,7) .tofixed (10)) === 0,3 // Результат верно
parsefloat ((11.0-11.8) .tofixed (10)) === -0,8 // Результат верен
Метод переработка
Кода -копия выглядит следующим образом:
// Используйте метод iSecaveral Tool, чтобы определить, равны ли значения или нет
Функция isecal (number1, number2, цифры) {
Digits = Digits == не определено?
return number1.tofixed (цифры) === number2.tofixed (цифры);
}
Isequal (1,0-0,7, 0,3);
// метод расширения нативного, предпочитаю объектно-ориентированный стиль
Number.prototype.isequal = function (номер, цифры) {
Digits = Digits == не определено?
вернуть this.tofixed (цифры) === number.tofixed (цифры);
}
(1,0-0,7) .ISEQUAL (0,3);