创建利润计算器

Creating a Profit Calculator

我正在尝试创建一个基本的利润计算器,但我正在努力解决一个问题。

我写了一些基本的 javascript 并且公式 almost 有效。但是我的问题是小数点似乎不想正常工作。例如:

什么情况成本:2.80 每箱多少单位:2 售价是多少:3.15 总利润 = 1.75 利润当然应该是 0.175

我是 JavaScript 的新手,非常感谢您的帮助。

<form id="profitCalculator">
<p><label>What is the case cost? <input type="text" name="casecost"></label></p>
<p><label>How many packs / units per case? <input type="text" name="packs"></label></p>
<p><label>What is the sell price? <input type="text" name="sell_price"></label></p>    
<p>Total profit £: <input type="text" name="profit"></p>

document.getElementById('profitCalculator').onclick = function () {
var casecost = this.elements['casecost'].value || 0;
var packs = this.elements['packs'].value || 0;
var sell_price = this.elements['sell_price'].value || 0;
var profit = sell_price - casecost / packs;
this.elements['profit'].value = profit.toFixed(2); }

谢谢

应该是

var profit = (sell_price - casecost) / packs;

但是 - 永远不要在 Javascript!

中计算带小数的货币

Javascript 会在十进制值变长时将其截断,这可能会导致严重的舍入错误。始终将您的值乘以 100,然后计算所有内容,最后再除以 100。

看看操作顺序,您可能知道这是 'BODMAS' 支持Link:http://www.mathsisfun.com/operation-order-bodmas.html

改为(sell_price - casecost) / packs;

请参阅 MDN 关于 Operator Precedence 的参考,您会看到除法(和乘法)在 加法或减法之前完成。所以你基本上有:

3.15 - (2.80 / 2) = 1.75

而不是:

(3.15 - 2.80) / 2 = 0.175

另请注意,正如@Adrian Schmidt 指出的那样,在数学中使用浮点数不是一个好主意。如果你在 javascript 中进行上述计算,你实际上得到:

0.17500000000000004

因为计算机在表示浮点数时没有无限精度。参见,例如:Is floating point math broken?

所以你的公式应该是:

(sell_price - casecost) / packs

另一件需要考虑的事情是,您从文本框中获得的值是字符串,而不是数字。您的公式有效,因为字符串没有 - 运算符,因此 javascript 会自动将您的值转换为数字。但这是一件危险的事情。例如,如果您这样做:

sell_price + casecost

使用您的示例输入,结果将是:

"3.152.80"

因为它是在进行字符串连接,而不是相加。

所以对包使用 parseFloat to convert your strings. (and parseInt 是值得的,因为它大概是一个整数)

所以一个完整的例子可能是这样的:

var casecost = parseFloat(this.elements['casecost'].value) * 100 || 0;
var packs = parseInt(this.elements['packs'].value, 10) || 0;  
var sell_price = parseFloat(this.elements['sell_price'].value) * 100 || 0;
var profit = ((sell_price - casecost) / packs) / 100;
this.elements['profit'].value = profit.toFixed(2); 

另请注意,如果 packs0,则您将出现被零除的错误。您需要添加逻辑来检查 packs 的值并在它为零时执行某些操作(不计算利润)。

你的问题是因为运算符的顺序。

var profit = sell_price - casecost / packs;

/(除法)先于 -(减号)出现。 以你为例。

2.80 / 2 = 1.4 
3.15 - 1.4 = 1.75

你应该放一些括号来覆盖必须优先的东西,在你的情况下,为了得到值 0.175,你应该像这样放。

(3.15 - 2.80) / 2 = 0.175

在代码中

var profit = (sell_price - casecost) / packs;