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



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

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

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

我的想法包括:

  • 隔离问题计算并单独处理
  • 将数字表示为长,并使用分进行计算
  • 使用BigDecimal并在Java中执行所有计算
  • 尽可能将数字存储在string中
  • 使用

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

最直接的方法是什么?

分离问题计算并单独处理

没有答案。你使用的任何技巧都可以从列表的其他地方找到。

将数字表示为长整数,并使用分进行计算

可行,但笨拙,在金融领域,一小部分是有效的:例如,外汇。

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

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

尽量将数字存储在string中

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

使用

没有答案。当然必须使用formatNumber,但它不能解决如何计算的问题。我看不出c:set和它有什么关系,它做的是不同的事情。它不是numberFormat的替代品

不将所有的业务逻辑移动到Java类中,什么是最好的方法是在静止时进行可靠的货币计算保持架构简单?

选择简单或可靠——在这种情况下你不能两者兼得——至少不是那个简单。

JSP页面中的业务逻辑是一种非常糟糕的代码气味——在一个小型的个人项目中已经足够糟糕了,但是为什么要在"电子商务平台"中这样做呢?

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

更好的是,考虑到你正在开发处理金融交易的软件,帮你自己和你的潜在客户一个大忙,雇佣一个知道他们在做什么的程序员。

我知道这有点侮辱人,但是考虑到你显然不熟悉Java编程语言和一般的体面编码实践,你真的没有资格编写处理别人钱的商业软件。

答对了。我的问题根本不在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
--%>

相关内容

  • 没有找到相关文章

最新更新