Может кто-то здесь, пожалуйста, помогите мне понять, как определить, когда ограничения с плавающей запятой вызовут ошибки в ваших расчетах. Например, следующий код.Понимание проблем с плавающей запятой
CalculateTotalTax = function (TaxRate, TaxFreePrice) {
return ((parseFloat(TaxFreePrice)/100) * parseFloat(TaxRate)).toFixed(4);
};
Мне не удалось ввести любые два значения, которые вызвали для меня неправильный результат для этого метода. Если я удаляю toFixed (4), я могу понять, где вычисления начинают терять точность (где-то около шестого десятичного разряда). Сказав это, мое понимание поплавков заключается в том, что иногда даже небольшие числа могут быть не представлены или я неправильно понял, и их можно было бы точно указать на 4 десятичных знака (например).
MSDN объясняет, как поплавки such ...
Это означает, что они не могут провести точную представления любого количества, которое не двоичная дробь (в^п формы к/ (2), где k и n являются целыми числами)
Теперь я предполагаю, что это относится ко всем поплавкам (в том числе к тем, которые использовались в javascript).
По существу, мой вопрос сводится к этому. Как определить, будет ли какой-либо конкретный метод уязвимым для ошибок в операциях с плавающей запятой, с какой точностью будут выполняться эти ошибки и какие входы потребуются для получения этих ошибок?
Надеюсь, что я прошу, имеет смысл.
Возможно, это связано с этой темой: http://en.wikipedia.org/wiki/Machine_epsilon –
* Тони Пони *, также известный как [Джон Скит] (http://stackoverflow.com/users/22656/jon-skeet), имеет [отличное объяснение] (http://codeblog.jonskeet.uk/2009/11/02/omg-ponies-aka-humanity-epic-fail/). Читаемые, понятные, забавные, не раздражающие и не такие тяжелые, как [некоторые ссылки] (http://docs.sun.com/source/806-3568/ncg_goldberg.html), которые часто публикуются на эту тему. – MarkJ