2012-04-03 13 views
7

Przyszedłem przez dziwny problem, chcę zrobić kilka podstawowych sprawdzeń matematycznych. Przeczytałem, aby unikać liczb zmiennoprzecinkowych, więc zdecydowałem się na pomnożyć moje wartości matematyczne z , ponieważ moja wartość może wynosić od 0,9 do 0,0025.JavaScript pomnożyć nie precyzję

Wszystko działa poprawne z wyjątkiem dwóch wartości: 0,56 i 0,57 :

var result = 0.57 * 10000 

wynik jest: +5699,999999999999, mam nadzieję na 5700 !! A 0.56 też idzie źle, ale wszystkie inne wartości są poprawne, czego tu brakuje?

+4

[Co każdy komputer naukowiec powinien wiedzieć o arytmetyki zmiennoprzecinkowej] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

@JamesAllardice Słynny Goldberg Wariacje! – kojiro

Odpowiedz

3

Do wyboru w JavaScript (w większości języków) to liczby całkowite lub zmiennoprzecinkowe. Jeśli napiszesz "0,57", zmuszasz go do świata zmiennoprzecinkowego, gdzie dokładność jest ograniczona.

Jeśli chcesz uzyskać absolutną dokładność, musisz pracować wyłącznie w liczbach całkowitych.

3
var result = 0.57 * 10000; 
alert (Math.round(result));​ 
0

Hacky rozwiązanie: value.toFixed(4).substr(-4).replace(/^0+/, "");

11

Najlepszym rozwiązaniem byłoby wykorzystanie toFixed (x) i ustaw x liczby dziesiętne, które powinny zawsze być większa niż spodziewane wyniki dziesiętnych (I zazwyczaj umieścić tam 8).

Ale zamiast hakowania - jak Kirilloid - powinieneś przekonwertować wynik z powrotem na numer, aby usunąć niepotrzebne miejsca dziesiętne. Następnie wykonaj dowolne formatowanie, które chcesz na tym numerze.

Więc byłoby to potrzebne zwrócić rezultat:

var result = +(0.57 * 10000).toFixed(8) 

wynik byłby teraz

znak + przed konwertuje wynik ciąg „toFixed” na numer ponownie.

Mam nadzieję, że pomogło!

0
var multiply = function(a, b) { 
    var commonMultiplier = 1000000; 

    a *= commonMultiplier; 
    b *= commonMultiplier; 

    return (a * b)/(commonMultiplier * commonMultiplier); 
}; 

Działa to w znanym zakresie. Dlatego dobrym pomysłem jest zaokrąglenie liczby do kropki dziesiętnej mniejszej niż commonMultiplier.

> multiply(3, .1) 
< 0.3 
> multiply(5, .03) 
< 0.15 
Powiązane problemy