有没有办法通过将costPerCan乘以整数而不是小数来计算总数?
它显示为使用Math.floor BUT的整数('Cans'数量),例如'No. Cans'= 1然后Total应该= 18.23英镑!
目前,canCount被视为等式中的小数?
$('input').keyup(function () { // run anytime the value changes
var width = parseFloat($('#width').val());
var height = parseFloat($('#height').val());
var SqMetresPerCan = parseFloat($('#per-can').val());
var costPerCan = parseFloat($('#cost').val());
var sizePerCan = parseFloat($('#size').val());
var canCount = width * height / SqMetresPerCan;
$('#added').html((canCount * costPerCan).toFixed(2));
$('#cans').html(Math.round(canCount.toFixed(2)));
所有代码都在这里:http://jsfiddle.net/5xzSy/523/
答案 0 :(得分:0)
由于你无法购买罐头的一部分,你必须将其四舍五入到下一个最高的整数,所以
var canCount = Math.ceil(width * height / SqMetresPerCan);
一旦你有一整套罐头,你的总价格就会是正确的。
答案 1 :(得分:0)
你真的想把罐头的数量减少到最低的整数(假设你有一个尺寸宽度和高度的容器,你希望装入一定数量的罐子而不需要经过),使用Math.floor()当你第一次计算它。
var canCount = Math.floor(width * height / SqMetresPerCan);
如果您使用Math.ceil作为另一张海报说,那么您将计算首先超过所提供空间的罐数。我想这可能是你所追求的(甚至是其他东西),但你没有描述你的意图。
现在,如果你试图将罐装入具有一定尺寸的容器中,你实际上解开了一个更难的问题,因为[大多数]罐头只能是一个形状(圆形)而且它们不会挤压填充彼此之间的空间。所以你将无法使用很多空间。
有关打包算法的讨论,请参阅此维基百科文章:http://en.wikipedia.org/wiki/Packing_problems
然而,你有一个变量“SqMetresPerCan”,其中可能包含用于强制进入网格的can的填充,使其成为一个更简单的问题,但仍然没有就像上面的代码片段一样简单。另外,该网格可能必须是均匀的,使得花哨的方形包装算法无用。
在这种情况下,您必须计算适合“宽度方向”的罐数,然后计算适合“高度方向”的罐数并将它们相乘。如果网格中的can占用x SqMetresPerCan
,则其宽度和高度均为Math.sqrt(x)
。例如,如果一个can有SqMetresPerCan = 9
,则每个方向占用的长度为Math.sqrt(9) = 3
。继续这个例子,如果我们有一个1000x1 SQMetres的容器,我们就无法适应任何罐头,因为罐头不能“挤压”任何一个方向。相反,如果它是1000x3容器,它将适合333罐而不是0,因为最小尺寸现在足以适合单个罐。考虑到这一点,canCount的改进方法是:
var canUnit = Math.sqrt(SqMetresPerCan)
var canCount = Math.floor(width/canUnit)*Math.floor(height/canUnit)
然后:
$('#added').html((canCount * costPerCan).toFixed(2));
$('#cans').html(canCount);
所以我们先做的是完全忽略size
,因为当我们SqMetresPerCan
时,我们完全不清楚应该如何使用它。然后我们计算一个罐子的单个维度,假设有填充“将一个圆圈变成一个正方形”。我们并不关心这里的地板,因为我们只是处理尺寸。然后我们计算适合每个方向的罐数(通过将容器尺寸除以罐子在该方向上的假设尺寸)并将它们相乘以得到罐的总数作为整数,我们可以正确打印远离使用toFixed。将该整数乘以costPerCan
以获得总成本,我们应该使用toFixed(2)
,因为它是货币。