Potrebbe qualcuno qui per favore aiutarmi a capire come determinare quando le limitazioni in virgola mobile causeranno errori nei calcoli. Ad esempio il seguente codice.Comprensione dei problemi in virgola mobile
CalculateTotalTax = function (TaxRate, TaxFreePrice) {
return ((parseFloat(TaxFreePrice)/100) * parseFloat(TaxRate)).toFixed(4);
};
Non sono stato in grado di immettere due valori che hanno causato per me un risultato errato per questo metodo. Se rimuovo il toFixed (4) posso infatti vedere dove i calcoli iniziano a perdere precisione (da qualche parte intorno al 6 ° decimale). Detto questo, però, la mia comprensione dei float è che anche i numeri piccoli possono a volte non essere rappresentati o ho frainteso e possono essere rappresentati in modo accurato 4 cifre decimali (ad esempio).
MSDN spiega come galleggianti such ...
Questo significa che non possono contenere un esatto rappresentazione di qualsiasi quantitativo non è una frazione binaria (di forma k/ (2^n) dove k e n sono numeri interi)
Ora presumo che questo si applica a tutti i float (inclusi quelli utilizzati in javascript).
Fondamentalmente la mia domanda si riduce a questo. Come si può determinare se qualche metodo specifico sarà vulnerabile agli errori nelle operazioni in virgola mobile, a quale precisione si verificheranno quegli errori e quali input saranno necessari per produrre quegli errori?
Speriamo che quello che sto chiedendo abbia senso.
Forse questo è relativo a questo argomento: http://en.wikipedia.org/wiki/Machine_epsilon –
* Tony the Pony *, noto anche come [Jon Skeet] (http://stackoverflow.com/users/22656/jon-skeet), ha una [spiegazione eccellente] (http://codeblog.jonskeet.uk/2009/11/02/omg-ponies-aka-humanity-epic-fail/). Leggibile, chiaro, divertente senza essere irritante, e non pesante come [alcuni link] (http://docs.sun.com/source/806-3568/ncg_goldberg.html) che sono spesso pubblicati su questo argomento. – MarkJ