2014-09-30 1 views
0

Я получаю ошибку 2.7755575615628914e-17, когда я пытаюсь добавить 15 минут, а затем вычитаю 5 минут 3 раза. Вместо этого должен быть нуль. Пожалуйста помоги.Добавить/вычесть минуты в/из часов после запятой

http://jsfiddle.net/3zq4napd/

$(document).on('click', '.add', function(event) { 
    var input = $('input'); 

    var inputVal = parseFloat($('input').val()); 
    var addVal = parseFloat($(this).data('num')); 
    var newVal = inputVal + (addVal/60); 

    $(input).val(newVal); 
}); 

$(document).on('click', '.sub', function(event) { 
    var input = $('input'); 

    var inputVal = parseFloat($('input').val()); 
    var subVal = parseFloat($(this).data('num')); 
    var newVal = inputVal - (subVal/60); 

    $(input).val(newVal); 
}); 
+0

Возможный дубликат [Является ли математика с плавающей запятой?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – 2014-09-30 03:34:26

+0

Ваша проблема связана с использованием математики с плавающей запятой вместо даты и времени. См. [Что каждый программист ...] (http://floating-point-gui.de/) – 2014-09-30 03:35:39

+0

Мне не нужно использовать дату и время, когда я могу использовать более простые подходы. –

ответ

1

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

EDIT: Лучший способ избежать ошибок с плавающей запятой, чтобы избежать иметь дело с числами, которые точно не представима в двоичной форме - то есть избегая любого разделения за исключением полномочий 2. Поскольку 60 не имеет значения 2, деление на 60 откроет дверь для ошибки с плавающей запятой. Таким образом, если вы можете полностью вычислить ваш счет за считанные минуты или в секундах или (стандарт JavaScript) за миллисекунды, вы останетесь полностью в целой земле.

(Вы можете даже рассчитывать в двадцатиминутных кварталах, потому что ваш минимальный блок составляет 5 минут, то есть 20/2^2, так что вы все еще в двоичном режиме. Но если вы считаете часы (т.е. шестидесятиминутные блоки) существует дальнейшее деление на 3, так как доли 3 не представляются в двоичном формате, появляется ошибка.)

+0

Округление делает неправильные значения в часах по десятичным знакам. –

+0

Число округлено в любом случае. '1/60' на самом деле не' 1/60', и это, конечно, не '0.016666666666666666' (так как фактическое представление бесконечно). Лучшее, что вы можете сделать, это снова округлить его до определенного количества цифр, когда вы хотите отобразить его. – Amadan

+0

Правильно, но это не позволит мне делать вычитание без математической ошибки, прежде чем я даже покажу. –

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