JavaScript, как сказать, если одно число кратно другому - PullRequest
21 голосов
/ 12 августа 2011

Я строю довольно сложную тележку для магазина тканей и обнаружила, что мне нужно сделать расчет по введенной пользователем длине * базовой цены за метр, но затем проверяю результат, чтобы увидеть, кратно ли онодлина рисунка.Если это не кратно, мне нужно найти ближайшее кратное длины шаблона и изменить результат на это.

Мне также нужно иметь возможность делать точно такие же вычисления в PHP, но если кто-то можетпомогите мне с математикой, я могу портировать все, что нужно перевести сам.

Я использую jQuery 1.6.2 и уже выполнил первую часть вычисления, мне просто нужно проверить результат (метров * цена) по отношению к длине фигуры.

Любая помощь с благодарностью

РЕДАКТИРОВАТЬ: Все эти вычисления включают в себя 2 знака после запятой как для цены, так и для длины фигуры.Введенная пользователем длина может также содержать десятичные дроби.

Ответы [ 5 ]

27 голосов
/ 12 августа 2011

Используйте оператор % (модуль) в Javascript и PHP, который возвращает остаток, когда a делится на b в a % b. Остаток будет равен нулю, когда a кратно 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
23 голосов
/ 12 августа 2011

Вы можете использовать модуль, чтобы найти остаток после деления, а затем, если остаток равен нулю, это кратно.

//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, затем выполните вышеуказанную проверку.

3 голосов
/ 12 августа 2011

В javascript есть оператор остатка (аналогично большинству языков с c-подобным синтаксисом).

Пусть x = длина и y = цена, а z = произведение x * y

var remainder = (z % x) / 100;

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

Чтобы получить ближайший x кратный вашему результату z, вы можете округлить результат в большую или меньшую сторону, используя функции ceil или floor в библиотеке Math.

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

Затем округлить до двух десятичных знаков

Math.round(a / 100) * 100;
1 голос
/ 12 августа 2011

Не уверен, что я действительно понял задачу, поскольку она кажется мне довольно простой, но взгляните на этот код 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;
0 голосов
/ 12 августа 2011
//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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...