2011-08-12 1 views
13

Buduję dość ciężki koszyk obliczeniowy dla sklepu z tkaninami i muszę znaleźć obliczenia na podstawie wprowadzonej przez użytkownika długości * podstawy ceny na metr, ale potem sprawdzanie wyniku, aby zobaczyć, czy jest to wielokrotność długości wzoru. Jeśli nie jest to wielokrotność, muszę znaleźć najbliższą wielokrotność długości wzoru i zmienić wynik na taki.javascript, jak sprawdzić, czy jedna liczba jest wielokrotnością innej

Muszę również być w stanie wykonać dokładnie takie same obliczenia w PHP, ale jeśli ktoś może mi pomóc z matematyką, mogę przesłać wszystko, co samemu trzeba przetłumaczyć.

Używam jQuery 1.6.2 i już wykonałem pierwszą część obliczeń, wystarczy sprawdzić wynik (metry * cena) w stosunku do długości wzoru.

Każda pomoc mile widziana

EDIT: Obliczenia te wszystkie obejmować 2 miejsca dziesiętne zarówno ceny i długości wzorca. Długość wprowadzona przez użytkownika może również zawierać wartości dziesiętne.

+3

Nie używaj arytmetyce zmiennoprzecinkowej jakość. Konwertuj ceny na centy. –

+0

Będę, wszystko jest zmiennoprzecinkowe, ponieważ tak to wynika z db :( – jammypeach

Odpowiedz

24

Użyj % (moduł) operatora w JavaScript i PHP, który zwraca pozostała część, gdy a jest dzielona przez b w a % b. Reszta będzie zerowa, gdy a jest wielokrotnością b.

Przykł.

//Javascript 
var result = userLength * basePrice;  //Get result 
if(result % patternLength){    //Check if there is a remainder 
    var remainder = result % patternLength; //Get remainder 
    if(remainder >= patternLength/2)  //If the remainder is larger than half of patternLength, then go up to the next mulitple 
    result += patternLength - remainder; 
    else         //Else - subtract the remainder to go down 
    result -= remainder; 
} 
result = Math.round(result * 100)/100; //Round to 2 decimal places 
+1

facepalm :) Miałem chociaż moduł, ale nie myślałem przez co mogę zrobić z resztą. to działa dla mnie, dzięki wielkie. – jammypeach

+0

Hej, nie chcę pisać duplikatu, masz na myśli napisanie szybkiego 'bool' dla' if (a% b) {} ', aby zwrócić true, jeśli' b' jest mnożnikiem 'a' ?? EDYCJA: poniższa odpowiedź wyjaśnia lepiej dla mojej sprawy. – thednp

16

Możesz użyć modułu, aby znaleźć pozostałą część po podziale, a jeśli reszta jest równa zero, jest to wielokrotność.

//x and y are both integers 
var remainder = x % y; 
if (remainder == 0){ 
//x is a multiple of y 
} else { 
//x is not a multiple of y 
} 

Jeśli numery używasz mogłoby być 2DP, moduł powinien nadal działać, jeśli nie, należy pomnożyć przez 100 zarówno pierwszej następnie przeprowadzić powyższą czek.

+5

Pamiętaj tylko, aby zaokrąglić liczbę, aby uniknąć problemów z pływającym punktem, takich jak http://stackoverflow.com/questions/3966484/zmiennoprzecinkowe-liczby-i-javascript-modulus-operator – Teodor

3

W javascript znajduje się operator pozostały (podobnie jak w większości języków ze składnią c-podobną).

Niech X = długość i y = cena i z = iloczyn x * y

var remainder = (z % x)/100; 

if (remainder === 0) { 
    // z is a multiple of x 
} 

Aby uzyskać możliwie najbliższe x wielokrotność do wynikowego Z można zaokrąglić wynik w górę (lub w dół) za pomocą ceil lub funkcje podłogowe w bibliotece Math.

if (r >= x/2) { 
    a = Math.ceil(z/x)*x; 
} 
else { 
    a = Math.floor(z/x)*x; 
} 

Następnie zaokrąglić do dwóch miejsc po przecinku

Math.round(a/100) * 100; 
1

Nie wiem, czy ja naprawdę rozumieć zadanie, gdyż wydaje się dość proste do mnie, ale spojrzeć na ten kod PHP:

// --- input --- 
$pattern = 12.34; 
$input = 24.68; 
$precision = 2; // number of decimals 

// --- calculation --- 

// switch to "fixed point": 
$base = pow(10, $precision); 
$pattern = round($pattern * $base); 
$input = round($input * $base); 

if ($input % $pattern) { 
    // not an exact multiple 
    $input = ceil($input/$pattern) * $pattern; 
} else { 
    // it is an exact multiple 
} 

// back to normal precision: 
$pattern /= $base; 
$input /= $base; 

Można to łatwo przetłumaczyć na JavaScript.

$input będzie następną najbliższą wielokrotnością wzorca. Jeśli wystarczy że i nie muszą wiedzieć, czy to rzeczywiście była wielokrotnością można też po prostu zrobić coś takiego:

$input = ceil($input * 100/$pattern) * $pattern/100; 
0
//roundDown to 2 decimal places function 
function r2(n) { 
    return Math.floor(n*100)/100; 
} 

neededLength = 4.55; 
price = 4.63; 
patternLength = 1.6; 

// price despite the length of the pattern 
priceSum = r2(neededLength * price); 

// calculate how many pattern lengths there must be to fit into needed length 
patternLengths = Math.floor((neededLength+patternLength)/patternLength); 
// calculate price for pattern lengths 
priceByPatternSum = r2((patternLengths * patternLength) * price);