我正在尝试创建一个基本的利润计算器,但我正在努力解决一个问题。
我已经写了一些基本的javascript,公式几乎有效。但是我的问题是小数点似乎不想正常工作。例如:
案件费用是多少: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); }
由于
答案 0 :(得分:3)
应该是
var profit = (sell_price - casecost) / packs;
但是 - 永远不要在Javascript中用小数计算货币!
Javascript会在它们变长时截断十进制值,可能会导致令人讨厌的舍入错误。始终将您的值乘以100,然后计算所有内容,最后再次除以100。
答案 1 :(得分:0)
查看操作顺序,你可能知道这是'BODMAS' 支持链接:http://www.mathsisfun.com/operation-order-bodmas.html
更改为(sell_price - casecost) / packs;
答案 2 :(得分:0)
请参阅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转换字符串是值得的。 (和包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
的值,并在它为零时执行某些操作(不计算利润)。
答案 3 :(得分:0)
因为运营商的推行而出现问题。
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;