Javascript, как определить, является ли одно число кратным другому
Я строю довольно расчетную тележку для магазина ткани и обнаружил, что мне нужно сделать расчет на введенной пользователем длине * базовый калькулятор на метр, но затем проверить результат, чтобы увидеть, является ли он кратным длина рисунка. Если он не кратный, мне нужно найти самое близкое кратное длины шаблона и изменить результат на него.
Мне также нужно иметь возможность делать точно такие же вычисления в PHP, но если кто-то может помочь мне с математикой, я могу переносить все, что нужно перевести.
Я использую jQuery 1.6.2 и уже выполнил первую часть расчета, мне просто нужно проверить результат (метры * цена) на длину шаблона.
Любая помощь очень ценится
EDIT: все эти вычисления включают в себя 2 десятичных знака как для цены, так и для длины рисунка. Введенная пользователем длина также может содержать десятичные знаки.
Ответы
Ответ 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))