创建利润计算器
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);
另请注意,如果 packs
为 0
,则您将出现被零除的错误。您需要添加逻辑来检查 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;
我正在尝试创建一个基本的利润计算器,但我正在努力解决一个问题。
我写了一些基本的 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);
另请注意,如果 packs
为 0
,则您将出现被零除的错误。您需要添加逻辑来检查 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;