使用JSTL / Tomcat进行财务计算的最佳实践

时间:2013-01-15 19:14:19

标签: java jsp jstl decimal

我正在使用Tomcat / JSTL / MySQL /等构建一个新的电子商务平台。

我知道与使用浮点计算有关的各种问题 - 例如12.3456000000000789 ...我知道舍入与截断也是一个问题。

如果不将所有业务逻辑转移到Java类中,在保持架构简单的同时,对货币进行可靠计算的最佳方法是什么?

我对可能性的看法包括:

  • 隔离问题计算并单独处理
  • 将数字表示为长数并使用美分进行计算
  • 使用BigDecimal并在Java中进行所有计算
  • 尽可能在字符串中存储数字
  • 使用< fmt:formatNumber var =“...而不是< c:set var =”...

我可能不是第一个这样做的人。

最直接的方法是什么?

3 个答案:

答案 0 :(得分:3)

  

隔离问题计算并单独处理

不是答案。无论您使用何种技术,都会来自您列表中的其他地方。

  

表示数字为长并使用美分进行计算

可行但笨拙,金融中有一小部分有效的案例:例如,外汇。

  

使用BigDecimal并在Java中进行所有计算

这就是答案。更好的是,在数据库中进行计算。

  

尽可能在字符串中存储数字

不是答案。你仍然需要计算,当你这样做时,技术将来自你列表中的其他地方。

  

使用< fmt:formatNumber var =“...而不是< c:set var =”...

不是答案。你肯定必须使用formatNumber,但它没有解决你将如何计算。我没有看到c:set与它有什么关系,它做了不同的事情。它不是numberFormat的替代品。

答案 1 :(得分:0)

  

没有将所有业务逻辑移动到Java类中,那是什么   仍然可以对货币进行可靠计算的最佳方法   保持架构简单?

选择简单或可靠 - 在这种情况下你不能同时拥有两者 - 至少不是 简单。

JSP页面中的业务逻辑是一个非常糟糕的代码味道 - 在一个小型的个人项目中它已经足够糟糕了,但为什么你会在“电子商务平台”中这样做呢?

尽管您犹豫不决,但我建议您将所有业务逻辑从JSP转移到适当的java类。

更好的是,鉴于您正在开发处理金融交易的软件,请为自己和您的潜在客户提供帮助,聘请一位知道自己在做什么的程序员。

我意识到这有点侮辱,但鉴于你明显缺乏对Java编程语言和一般的编码实践的熟悉,你真的没有商业软件来处理其他人的钱。< / p>

答案 2 :(得分: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
--%>