2015-02-24 122 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;