2013-01-15 40 views
3

我正在使用Tomcat/JSTL/MySQL /等構建新的電子商務平臺。使用JSTL/Tomcat進行財務計算的最佳實踐

我知道與使用浮點計算相關的各種問題 - 例如, 12.3456000000000789 ...我知道舍入vs截斷也是一個問題。

沒有將所有業務邏輯轉移到Java類中,在保持架構簡單的同時對貨幣進行可靠計算的最佳方式是什麼?

我在準備的想法包括:

  • 找出問題的計算,並與他們單獨處理
  • 代表數字爲多頭做使用美分
  • 使用BigDecimal的計算和做在Java中
  • 所有計算
  • 儘可能在字符串中存儲數字
  • 使用< fmt:formatNumber var =「...而不是< c:set va r =「...

我可能不是第一個這樣做的人。

什麼是最直接的方法?

+0

我聽說的BigDecimal是專爲這樣的事情。 雖然我不是專家。 –

+2

通過互聯網搜索。這個問題已經得到解答:[每個計算機科學家應該知道的關於浮點運算的知識](http://www.cse.msu.edu/~cse320/Documents/FloatingPoint.pdf)。簡短的回答:使用'BigDecimal'。 –

+0

''對於視圖很有幫助,因爲大多數客戶不會看到2位以上的小數; 此外,您可以添加貨幣符號,這非常好。 –

回答

3

找出問題的計算,並與他們單獨處理

不是答案。無論您使用哪種技術,都會來自您的列表中的其他地方。

代表數字爲多頭和使用美分

可行的,但拙劣的做計算,並有在金融情況下,一分的分數是有效的:例如外匯。

使用BigDecimal和做所有的計算在Java中

這就是答案。更好的是,在數據庫中進行計算。

店數字符串中儘可能

不是答案。你仍然需要計算,而且當你做這個技術時,它會來自你列表中的其他地方。

使用< FMT:formatNumber VAR = 「...而不是< C:一套VAR =」 ...

不是答案。你一定要使用formatNumber,但是它並沒有解決你將如何計算。我沒有看到c:set與它有什麼關係,它做了一個不同的事情。這不是numberFormat的替代方案。

0

沒有所有的業務邏輯移動到Java類,什麼是 使貨幣計算的可靠性,同時仍保持 結構簡單的最佳方式?

選擇簡單或可靠 - 在這種情況下你不能真的有兩個 - 至少不是簡單。

JSP頁面中的業務邏輯是一種非常糟糕的代碼異味 - 在一個小型的個人項目中這已經夠糟了,但爲什麼要在「電子商務平臺」中這樣做呢?

儘管您猶豫如此,但我建議您將所有業務邏輯從JSP移至適當的Java類。

更好的是,鑑於您正在開發處理金融交易的軟件,請自己和您的潛在客戶一個大忙,並聘請一位知道自己在做什麼的程序員。

我意識到這有點侮辱,但鑑於你明顯缺乏對Java編程語言和一般體面編碼實踐的熟悉程度,你確實沒有商業寫軟件來處理其他人的錢。

+0

是的。有點侮辱。我正在構建一個快速原型,並試圖保持它的亮度。 – PrecisionPete

0

賓果。我的問題根本不在EL中。原來我意外地在數據庫中有一些浮點數字段。當我將它們改回小數點後,一切都落空了。

似乎如果你從MySQL中取出一個十進制數,你會得到一個BigDecimal。所以這個詞畢竟是有序的。

謝謝大家的意見。

看到:

<c:set var="tests" value="123.45"/> 
<br>tests: ${tests} -- <%= pageContext.findAttribute("tests").getClass() %> 

<c:set var="testl" value="${3}"/> 
<br>testl: ${testl} -- <%= pageContext.findAttribute("testl").getClass() %> 

<c:set var="testd" value="${123.45}"/> 
<br>testd: ${testd} -- <%= pageContext.findAttribute("testd").getClass() %> 

<c:set var="testbd" value="<%= new BigDecimal(\"123.45\") %>"/> 
<br>testbd: ${testbd} -- <%= pageContext.findAttribute("testbd").getClass() %> 

<c:set var="testbd" value="${testbd+1}"/> 
<br>testbd: ${testbd} -- <%= pageContext.findAttribute("testbd").getClass() %> 

<sql:query var="items"> 
SELECT * FROM items WHERE itemid=?; 
<sql:param value="55" /> 
</sql:query> 
<c:set var="testdb" value="${items.rows[0].price}"/> 
<br>testdb: ${testdb} -- <%= pageContext.findAttribute("testdb").getClass() %> 

<%-- output 
tests: 123.45 -- class java.lang.String 
testl: 3 -- class java.lang.Long 
testd: 123.45 -- class java.lang.Double 
testbd: 123.45 -- class java.math.BigDecimal 
testbd: 124.45 -- class java.math.BigDecimal 
testdb: 129.95 -- class java.math.BigDecimal 
--%>