我正在使用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
--%>