2017-02-07 3 views
0

Я работаю над проектом электронного обучения, и мне нужно иметь простую функцию проверки, которая принимает 3 массива и возвращает true, когда каждый элемент 3-го массива равен первому элементу, соответствующему элементу, умноженному на элемент 2-го массива.Почему это простое сравнение не работает корректно в JavaScript?

3 массива имеют одинаковую длину.

Примеры:

verifyNotes([5], [2], [11]) 
//should return false because 5*2=10 
verifyNotes([5], [2], [10]) 
//should return true 

Это функция я создал (я думаю, что нет ничего особенного):

function verifyNotes(coefficients, notes, savedResults){ 
 
\t var resultVerif=true; 
 
\t savedResults.forEach(function(element, i){ 
 
\t \t if((coefficients[i]*notes[i]) !== savedResults[i]){ 
 
\t \t \t resultVerif=false; 
 
\t \t } 
 
\t }); 
 
\t return resultVerif; 
 
} 
 

 
var verif1 = verifyNotes([1,4,2], [12,16,8], [12,64,16]); 
 
console.info("Verif1: Are notes okay?", verif1);

Проблема

Когда у меня есть float notes, функция возвращает false когда она должна возвращать верно (начиная с 1,5 * 15,66 = 23,49) в этом примере:

var verif2 = verifyNotes([1,4,2,1.5], [12,16,8,15.66], [12,64,16,23.49]); 
console.info("Verif2: Are notes okay?", verif2); 
//ouputs: Verif2: Are notes okay? false 

Что происходит не так?

+0

Hit F12 в вашем браузере, перейдите в раздел «консоль», тип в '1.5 * 15.66' и нажмите enter – elementzero23

+0

Здесь у вас есть свет об этом: http://stackoverflow.com/questions/588004/is-floating-point-math-broken –

+0

@ elementzero23, чтобы проиллюстрировать то, что вы говорите; '1.5 * 15.66 23.490000000000002 (1.5 * 15.66) .toFixed (2) " 23.49 "' – Laazo

ответ

4

Это ошибка округления. Вы можете округлить свой номер фиксированной суммы цифр, например:

parseFloat((your_number).toFixed(2)); 

В частности, на if(parseFloat((coefficients[i]*notes[i]).toFixed(2))

Смежные вопросы