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

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

Вопрос:

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

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

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

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

EDIT: все эти вычисления включают в себя 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 Ответ №1

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

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

Ответ №2

В 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; Ответ №3

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

Это позволяет избежать проблем с точностью 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))

Оцените статью
Добавить комментарий