私はファブリックストア用のかなり計算が重いカートを構築しており、ユーザーが入力した長さ*メートルあたりの基本価格で計算する必要があることに気づきましたが、結果をチェックしてパターン長の倍数であるかどうかを確認します。倍数でない場合、パターンの長さの最も近い倍数を見つけて、結果をそれに変更する必要があります。
PHPでもまったく同じ計算ができる必要がありますが、もし誰かが数学を手伝ってくれるなら、自分で翻訳する必要のあるものを移植できます。
私はjQuery 1.6.2を使用しており、すでに計算の最初の部分が完了しているので、パターンの長さに対して(metres * price)の結果を確認するだけです。
どんな助けも大歓迎
編集:これらの計算はすべて、価格とパターンの長さの両方について小数点以下2桁を含みます。ユーザーが入力した長さにも小数が含まれる場合があります。
JavascriptおよびPHPで%
(モジュラス)演算子を使用します。これは、a % b
でa
をb
で割ったときの剰余を返します。 a
がb
の倍数の場合、残りはゼロになります。
例.
//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
モジュラスを使用して、除算後の剰余を見つけることができます。剰余がゼロに等しい場合、それは倍数になります。
//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倍してから上記のチェックを実行します。
Javascriptには剰余演算子があります(cに似た構文を持つほとんどの言語に類似)。
X =長さ、y =価格、z = x * yの積とする
var remainder = (z % x) / 100;
if (remainder === 0) {
// z is a multiple of x
}
結果zに最も近いx倍数を取得するには、Mathライブラリのceil関数またはfloor関数を使用して結果を切り上げ(または切り捨て)ます。
if (r >= x / 2) {
a = Math.ceil(z/x)*x;
}
else {
a = Math.floor(z/x)*x;
}
次に、小数点以下2桁に丸めます
Math.round(a / 100) * 100;
本当に簡単に思えるので、タスクを本当に理解したかどうかはわかりませんが、これを見てください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;
これは簡単にJavaScriptに変換できます。
$input
は、パターンの次に近い倍数になります。それが必要なだけで、それが実際に複数であるかどうかを知る必要がない場合は、次のようなこともできます。
$input = ceil($input * 100 / $pattern) * $pattern / 100;
//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 );