Tôi đang xây dựng một giỏ hàng nặng về tính toán cho một cửa hàng vải và thấy mình cần phải tính toán trên chiều dài nhập của người dùng * Baseprice trên mét, nhưng sau đó kiểm tra kết quả để xem đó có phải là bội số của chiều dài mẫu không. Nếu nó không phải là bội số, tôi cần tìm bội số gần nhất của chiều dài mẫu và thay đổi kết quả thành đó.
Tôi cũng cần có thể thực hiện chính xác cùng một tính toán trong PHP, nhưng nếu bất cứ ai có thể giúp tôi với các toán học, tôi có thể chuyển bất cứ thứ gì cần được tự dịch.
Tôi đang sử dụng JQuery 1.6.2 và đã thực hiện phần đầu tiên của phép tính, tôi chỉ cần kiểm tra kết quả của [giá*giá] so với độ dài mẫu.
Bất kỳ sự giúp đỡ nào được đánh giá rất cao
Chỉnh sửa: Những tính toán này đều liên quan đến 2 số thập phân cho cả giá và chiều dài mẫu. Độ dài đầu vào của người dùng cũng có thể chứa số thập phân.
Hỏi ngày 12 tháng 8 năm 2011 lúc 9:08Aug 12, 2011 at 9:08
4
Sử dụng toán tử
//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
}
0 [mô đun] trong JavaScript và PHP, trả về phần còn lại khi //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
}
1 được chia cho //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
}
2 trong //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
}
3. Phần còn lại sẽ bằng không khi //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
}
1 là bội số của //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
}
2.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
Đã trả lời ngày 12 tháng 8 năm 2011 lúc 9:21Aug 12, 2011 at 9:21
Máy bay kế hoạch kỹ thuật sốDigital Plane
36,6K7 Huy hiệu vàng56 Huy hiệu bạc59 Huy hiệu Đồng7 gold badges56 silver badges59 bronze badges
3
Bạn có thể sử dụng mô đun để tìm phần còn lại sau một bộ phận và sau đó nếu phần còn lại bằng 0 thì đó là bội số.
//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
}
Nếu các số bạn sử dụng có thể là 2DP, mô đun vẫn sẽ hoạt động, nếu không, nhân cả hai với 100 trước sau đó thực hiện kiểm tra trên.
Đã trả lời ngày 12 tháng 8 năm 2011 lúc 9:17Aug 12, 2011 at 9:17
1
Điều này tránh các vấn đề chính xác của JavaScript [nếu yếu tố của bạn
//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
}
6 có ít hơn 5 số thập phân].function isMultiple[x, y] {
return Math.round[x / y] / [1 / y] === x;
}
Thuật toán trên sẽ thất bại cho các yếu tố rất nhỏ
Nếu bạn đang làm việc với các giá trị khoa học, hãy sử dụng Big.js.
function decimalPlaces[x] {
const str = ''+ +x;
const dindex = str.indexOf['.'];
const eindex = str.indexOf['e'];
return [
[dindex < 0 ? 0 : [eindex < 0 ? str.length : eindex] - dindex - 1] +
[eindex < 0 ? 0 : Math.max[0, -parseInt[str.slice[eindex + 1]]]]];
}
function isMultiple[x, y] {
const xplaces = decimalPlaces[x];
const yplaces = decimalPlaces[y];
if [xplaces > yplaces] {
return false;
}
const pfactor = Math.pow[10, yplaces];
return Math.round[pfactor * x] % Math.round[pfactor * y] === 0;
}
[
[2.03, 0.01],
[2.03, 0.0123],
[2.029999999999, 0.01],
[2.030000000001, 0.01],
[0.03, 0.01],
[240, 20],
[240, 21],
[1, 1],
[4, 2],
[6, 3],
[6, 4],
[1.123456, 0.000001]
].forEach[[[number, multiple]] => {
const result = isMultiple[number, multiple];
console.log[`isMultiple [${number}, ${multiple}] =`, result];
}];
Đã trả lời ngày 17 tháng 10 năm 2019 lúc 20:54Oct 17, 2019 at 20:54
Adam Leggettadam LeggettAdam Leggett
3.40829 Huy hiệu bạc23 Huy hiệu đồng29 silver badges23 bronze badges
Trong JavaScript có toán tử còn lại [tương tự như hầu hết các ngôn ngữ có cú pháp giống C].
Đặt x = length và y = price và z = sản phẩm của x*y
var remainder = [z % x] / 100;
if [remainder === 0] {
// z is a multiple of x
}
Để có được số x gần nhất với kết quả Z của bạn, bạn có thể làm tròn kết quả [hoặc xuống] bằng cách sử dụng các hàm trần hoặc sàn trong thư viện toán học.
if [r >= x / 2] {
a = Math.ceil[z/x]*x;
}
else {
a = Math.floor[z/x]*x;
}
Sau đó tròn đến hai vị trí thập phân
Math.round[a / 100] * 100;
Đã trả lời ngày 12 tháng 8 năm 2011 lúc 9:19Aug 12, 2011 at 9:19
Peter Kellypeter KellyPeter Kelly
14.1k6 Huy hiệu vàng52 Huy hiệu bạc62 Huy hiệu Đồng6 gold badges52 silver badges62 bronze badges
Không chắc chắn nếu tôi thực sự hiểu nhiệm vụ vì nó có vẻ khá đơn giản với tôi, nhưng hãy xem mã PHP này:
// --- 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;
Điều này có thể dễ dàng dịch sang JavaScript.
//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
}
8 sẽ là bội số gần nhất tiếp theo của mẫu. Nếu bạn chỉ cần điều đó và không cần biết liệu nó có thực sự là bội số, bạn cũng có thể chỉ cần làm điều gì đó như thế này:$input = ceil[$input * 100 / $pattern] * $pattern / 100;
Đã trả lời ngày 12 tháng 8 năm 2011 lúc 9:19Aug 12, 2011 at 9:19
Peter Kellypeter KellyUdo G
14.1k6 Huy hiệu vàng52 Huy hiệu bạc62 Huy hiệu Đồng11 gold badges54 silver badges87 bronze badges
//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 ];
Không chắc chắn nếu tôi thực sự hiểu nhiệm vụ vì nó có vẻ khá đơn giản với tôi, nhưng hãy xem mã PHP này:Aug 12, 2011 at 9:38
Điều này có thể dễ dàng dịch sang JavaScript.vellotis
8 sẽ là bội số gần nhất tiếp theo của mẫu. Nếu bạn chỉ cần điều đó và không cần biết liệu nó có thực sự là bội số, bạn cũng có thể chỉ cần làm điều gì đó như thế này:1 gold badge11 silver badges26 bronze badges//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
}