2015-02-24 98 views
0

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

我写了一些基本的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

在最小的货币单位工作 - 我们人类上随机基地10决定,电脑在基地2工作,所以什么在计算机发生在你尝试做'0.1 + 0.2'?疯狂! - 因此,做更小的货币单位'10 + 20'而不是(在你的情况下,'3.15 - 2.8; //给出0.3500000000000001') – 2015-02-24 14:55:31

+0

感谢保罗,现在有道理,为什么我得到奇怪的数字。 – 2015-02-26 08:49:56

回答

3

应该

var profit = (sell_price - casecost)/packs; 

但是 - 决不算货币,在Javascript小数!

当它们变得很长时,Javascript会截断十进制值,可能会导致令人讨厌的舍入错误。总是把你的值乘以100,然后计算一切,最后再除以100。

+1

感谢所有帮助过我的人。它现在工作! (但当然,你们都知道这会在修改后):) – 2015-02-26 08:48:58

0

见MDN对Operator Precedence参考,你会看到该部门(和乘法)在之前完成加法或减法。所以,你有本质:

3.15 - (2.80/2) = 1.75 

相反的:

(3.15 - 2.80)/2 = 0.175 

另外请注意,@Adrian施密特指出,使用浮点数运算是一个坏主意。如果你在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的值,并在零(不计算利润)时做一些事情。

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;