2013-06-28 23 views
6

Czy istnieje lepszy sposób obliczenia liczby miejsc dziesiętnych na liczbie niż w moim przykładzie?Najprostszy sposób na uzyskanie liczby miejsc po przecinku w liczbie w kodzie JavaScript

var nbr = 37.435.45; 
var decimals = (nbr!=Math.floor(nbr))?(nbr.toString()).split('.')[1].length:0; 

Lepiej rozumiem szybsze wykonywanie i/lub używanie natywnej funkcji JavaScript, np. coś takiego jak nbr.getDecimals().

Z góry dziękuję!

EDIT:

Po zmodyfikowaniu series0ne odpowiedź, najszybszy sposób mogę zarządzać to: test

var val = 37.435345; 
var countDecimals = function(value) { 
    if (Math.floor(value) !== value) 
     return value.toString().split(".")[1].length || 0; 
    return 0; 
} 
countDecimals(val); 

Speed: http://jsperf.com/checkdecimals

+2

Spójrz na tę bardzo dokładną odpowiedź http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number – Archer

+0

Dziękuję, ale Pytający stwierdził, że liczba musi być liczbą dziesiętną, a ja nie. +1 za interesujący link – PhilTrep

+0

@ PhilippeTrépanier, zastanów się, co jest ważniejsze w wielkim schemacie rzeczy. Jak szybko uruchamia się JavaScript (różnica pomiędzy moją odpowiedzią a Pete D jest minimalna), a prędkość jest pobierana dla klienta? Ponieważ odpowiedź Pete'a D'jest krótsza o kilka bajtów, osobiście znajdę się w kłopotliwym położeniu, do wyboru. – series0ne

Odpowiedz

22
Number.prototype.countDecimals = function() { 
    if(Math.floor(this.valueOf()) === this.valueOf()) return 0; 
    return this.toString().split(".")[1].length || 0; 
} 

po związaniu z prototypem, to pozwala aby uzyskać liczbę dziesiętną (countDecimals();) bezpośrednio ze zmiennej liczbowej.

E.G.

var x = 23.453453453; 
x.countDecimals(); // 9 

Działa poprzez przekształcenie numer do łańcucha, dzielenie na . i zwraca ostatnią część tablicy lub 0, jeśli ostatnia część tablicy jest niezdefiniowana (co nastąpi, jeśli nie ma przecinka dziesiętnego).

Jeśli nie chcą wiązać się to do prototypu, można po prostu użyć tego:

var countDecimals = function (value) { 
    if(Math.floor(value) === value) return 0; 
    return value.toString().split(".")[1].length || 0; 
} 
+0

Dziękuję, właśnie tego potrzebuję! Przyjmuję, jak tylko minie mój czas odnowienia ... – PhilTrep

+0

Nie ma problemu, nie ma za co! :-) – series0ne

+5

To spowoduje błąd dla liczby całkowitej: http://jsfiddle.net/3bQqV/ Ale może to nie jest problem dla OP –

0

Regex nie są bardzo wydajne w obliczeniach, są średnie czy można go w inny sposób. Więc unikam ich :)

Rzeczy takie jak "Liczba% 1" zwracają zaokrągloną wartość dziesiętną (2.3% 1 = 0.2999999999999998), i ogólnie zalecam ci, abyś używał ciągów jak najwcześniej, ponieważ przybliżenia z liczbami rzeczywistymi może zmienić liczbę miejsc dziesiętnych.

Twoje jest w porządku, ale będę szukał sposobu na zoptymalizowanie go.

Edit:

function CountDecimalDigits(number) 
{ 
    var char_array = number.toString().split(""); // split every single char 
    var not_decimal = char_array.lastIndexOf("."); 
    return (not_decimal<0)?0:char_array.length - not_decimal; 
} 
8

Dodawanie do series0ne odpowiedź, jeśli chcesz mieć kod nie rzucać błąd dla całkowitej liczby i uzyskać wynik równy 0, gdy nie ma miejsca dziesiętne użyj:

var countDecimals = function (value) { 
    if ((value % 1) != 0) 
     return value.toString().split(".")[1].length; 
    return 0; 
}; 
+0

+1 wygląda dobry ... –

+1

może być szybszy jak: 'var countDecimals = function (value) { return value% 1? value.toString(). split (". ") [1] .length: 0; }; ' –

+0

@OP powinieneś przetestować odpowiedzi w jsperf, aby zobaczyć, który wydaje się najlepszy –