4

Tomcat/JSTL/MySQL/etc を使用して新しい e コマース プラットフォームを構築しています。

浮動小数点計算の使用に関連するさまざまな問題を認識しています - 例: 12.3456000000000789... 丸めと切り捨ても問題になる可能性があることを知っています。

すべてのビジネス ロジックを Java クラスに移動せずに、アーキテクチャをシンプルに保ちながら、信頼性の高い通貨計算を行う最善の方法は何でしょうか?

可能性についての私の考えは次のとおりです。

  • 問題の計算を分離し、個別に処理する
  • 数値を long として表し、セントを使用して計算を行う
  • BigDecimal を使用し、すべての計算を Java で行う
  • 可能な限り文字列に数値を格納する
  • <c:set var="... の代わりに <fmt:formatNumber var="... を使用します

これを行うのは私が初めてではないかもしれません。

最も簡単なアプローチは何ですか?

4

3 に答える 3

3

問題の計算を分離し、個別に処理する

答えではありません。使用するテクニックは、リストの他の場所から取得されます。

数値を long として表し、セントを使用して計算を行う

実現可能だがぎこちなく、金融では 1 セントの端数が有効な場合もあります。たとえば、外国為替です。

BigDecimal を使用し、すべての計算を Java で行う

これが答えです。さらに良いことに、データベースで計算を行います。

可能な限り文字列に数値を格納する

答えではありません。あなたはまだ計算する必要があり、そうするとき、テクニックはあなたのリストのどこかから来ます.

<c:set var="... の代わりに <fmt:formatNumber var="... を使用します

答えではありません。確かに formatNumber を使用する必要がありますが、計算方法には対応していません。c:set が何をしなければならないのかわかりません。別のことをします。これは numberFormat に代わるものではありません。

于 2013-01-15T23:14:20.030 に答える
0

ビンゴ。私の問題はELにはまったくありませんでした。データベースにいくつかの float フィールドが誤って含まれていたことが判明しました。それらを小数に戻すと、すべてがうまくいきました。

MySQL から 10 進数を引き出すと、隠れて 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
--%>
于 2013-01-16T06:29:23.680 に答える
0

すべてのビジネス ロジックを Java クラスに移動せずに、アーキテクチャをシンプルに保ちながら、信頼性の高い通貨計算を行う最善の方法は何でしょうか?

シンプルまたは信頼できるものを選択してください - この場合、実際には両方を持つことはできません - 少なくともそれほど単純はありません.

JSP ページのビジネス ロジックは、コードの匂いが本当にひどいものです。小さな個人的なプロジェクトでは十分ですが、「e コマース プラットフォーム」でそれを行うのはなぜでしょうか。

そうすることをためらっていますが、すべてのビジネス ロジックを JSP から適切な Java クラスに移動することをお勧めします。

さらに良いことに、金融取引を処理するソフトウェアを開発していることを考えると、自分自身と潜在的な顧客に大きな恩恵をもたらし、彼らが何をしているかを知っているプログラマーを雇う必要があります。

これが少し侮辱的であることは承知していますが、Java プログラミング言語と一般的な適切なコーディング慣行の両方に精通していないことが明らかであることを考えると、他人のお金を扱う商用ソフトウェアを作成するビジネスは本当にありません。

于 2013-01-16T03:27:07.063 に答える