2011-08-12 11 views
13

私はファブリックストア用にかなり重いカートを構築していますが、ユーザーが入力した長さで計算する必要があることがわかりました。パターンの長さの倍数であるかどうかを調べる。それが倍数でない場合は、パターンの長さの最も近い倍数を見つけてその結果をそれに変更する必要があります。javascript 1つの数値が別の数値の倍数であるかどうかを調べる方法

PHPでも同じ計算を行うことができる必要がありますが、誰かが数学で私を助けることができれば、自分で翻訳する必要のあるものを移植することができます。

私はjQuery 1.6.2を使用しており、すでに計算の最初の部分を行っています。パターン長に対して(meters * price)の結果を確認するだけです。

すべてのヘルプは大

EDITを感謝:これらの計算はすべて価格とパターン長の両方に小数点以下2桁を伴います。ユーザーが入力した長さには小数点も含まれます。

+3

お金のために浮動小数点演算を使用しないでください。価格をセントに変換します。 –

+0

私はすべてが浮動小数点atmなので、それはそれがdbから出る方法です:( – jammypeach

答えて

24

返しJavascriptとPHPで%(モジュラス)演算子を使用します残りはabで割ったときにa % bになります。 abの倍数である場合、残りはゼロになります。

Ex。

//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 :)私はモジュラスを持っていましたが、私は残りの部分で何ができるかを考えませんでした。これは私にとっては大変感謝しています。 – jammypeach

+0

ねえ、複写を書いたくないのですが、 'b'が' a'の乗数であれば 'if(a%b){}'が真を返すための素早い 'bool'を書くでしょうか?編集:私の場合は、以下の答えが良い説明します。 – thednp

16

除算後の剰余を見つけるためにモジュラスを使用し、残りがゼロに等しい場合は、それは倍数です。

//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 
} 

あなたが使用して数字が2DPすることができれば、弾性率はまだ上記のチェックを行って、最初の100の両方を掛け、仕事、もしべきではありません。

+5

http://stackoverflow.com/questions/3966484のような浮動小数点の問題が発生しないように番号を丸めておいてください。/floating-point-numbers-and-javascript-modulus-operator – Teodor

3

JavaScriptには剰余演算子があります(ほとんどの言語に似た構文を持っています)。

は切り上げを使用して、あなたが結果を切り上げ(またはダウン)ができ、あなたの結果zに最も近いXの複数を取得するには、X =長さとy =価格とx * yを

var remainder = (z % x)/100; 

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

のZ =積みましょうかfloor関数を数学ライブラリに追加します。その後

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

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

ない、私は本当にそれが私には非常に簡単だと思われたタスクを理解しますが、このPHPコードを見ている場合は必ず小数点以下2桁ラウンド:

// --- 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; 

これは簡単にJavaScriptに変換できます。

$inputは、次にパターンの倍数になります。 あなたはちょうどそれを必要とし、それは実際にあなたが、単にこのような何かを行うことができ、複数のだったかどうかを知る必要がない場合:

$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);