Je construis un chariot assez lourd à calculer pour un magasin de tissus et j'ai trouvé que je devais faire un calcul sur la longueur entrée par l'utilisateur * le prix de base par mètre, mais vérifier ensuite le résultat pour voir s'il s'agit d'un multiple de la longueur du motif. Si ce n'est pas un multiple, je dois trouver le multiple le plus proche de la longueur du motif et changer le résultat en cela.
Je dois également pouvoir faire exactement le même calcul en PHP, mais si quelqu'un peut m'aider avec les mathématiques, je peux porter tout ce qui doit être traduit moi-même.
J'utilise jQuery 1.6.2 et j'ai déjà effectué la première partie du calcul, j'ai juste besoin de vérifier le résultat de (mètres * prix) par rapport à la longueur du motif.
Toute aide grandement appréciée
EDIT: Ces calculs impliquent tous deux décimales pour le prix et la longueur du motif. La longueur entrée par l'utilisateur peut également contenir des décimales.
Utilisez l'opérateur %
(Module) en Javascript et PHP, qui renvoie le reste lorsque a
est divisé par b
dans a % b
. Le reste sera nul lorsque a
est un multiple de b
.
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
Vous pouvez utiliser le module pour trouver le reste après une division, puis si le reste est égal à zéro, c'est un multiple.
//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
}
Si les nombres que vous utilisez peuvent être à 2dp, le module devrait toujours fonctionner, sinon, multipliez les deux par 100 d'abord, puis effectuez la vérification ci-dessus.
En javascript, il y a l'opérateur restant (similaire à la plupart des langues avec une syntaxe de type c).
Soit x = longueur et y = prix et z = produit de x * y
var remainder = (z % x) / 100;
if (remainder === 0) {
// z is a multiple of x
}
Pour obtenir le multiple x le plus proche de votre résultat z, vous pouvez arrondir le résultat vers le haut (ou vers le bas) en utilisant les fonctions ceil ou floor dans la bibliothèque Math.
if (r >= x / 2) {
a = Math.ceil(z/x)*x;
}
else {
a = Math.floor(z/x)*x;
}
Arrondissez ensuite à la deuxième décimale
Math.round(a / 100) * 100;
Je ne sais pas si j'ai vraiment compris la tâche car elle me semble assez simple, mais jetez un œil à ce code 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;
Cela peut être facilement traduit en JavaScript.
$input
sera le prochain multiple le plus proche du motif. Si vous avez juste besoin de cela et que vous n'avez pas besoin de savoir s'il s'agissait réellement d'un multiple, vous pouvez également simplement faire quelque chose comme ceci:
$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 );