创建利润计算器

时间:2015-02-24 14:38:54

标签: javascript calculator

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

我已经写了一些基本的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); }

由于

4 个答案:

答案 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); 

另请注意,如果packs0,那么您将有零除错误。您将要添加逻辑来检查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;