Подтвердить что ты не робот

Javascript, как определить, является ли одно число кратным другому

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

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

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

Любая помощь очень ценится

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

4b9b3361

Ответ 1

Используйте оператор % (модуль) в 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

Ответ 2

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

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

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

Ответ 4

Не уверен, что я действительно понял задачу, поскольку мне кажется довольно простой, но посмотрите на этот код 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;

Ответ 5

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

Ответ 6

Это позволяет избежать проблем с точностью JavaScript.

function isMultiple(x, y) {
  return Math.round(x / y) / (1 / y) === x;
}

console.log(isMultiple(2.03, .01))
console.log(isMultiple(2.034, .01))
console.log(isMultiple(.03, .01))
console.log(isMultiple(240, 20))
console.log(isMultiple(240, 21))
console.log(isMultiple(1, 1))