2016-05-18 6 views
1

私はサードパーティライブラリorg.nfunk.jepを使用しています。すべての計算は、入力変数がどのタイプにあっても、ライブラリー内のdoubleにあります。次のコードが実行されるときに:BigDecimalを使用したJEPライブラリ

BigDecimal value1 = new BigDecimal("29250.24"); 
BigDecimal value2 = new BigDecimal("263.21"); 
JEP calc = new JEP(); 
calc.addVariable("var1", Double.parseDouble(value1)); 
calc.addVariable("var2", Double.parseDouble(value2)); 
calc.parseExpression("var1 - var2"); 
System.out.println("Result: " + calc.getValue()); 

を私は "28987.03" のようになりたいが、私はそのような結果が得られます。

結果:28987.0300000002

たぶん誰かが動作する方法を知っていますこのライブラリはBigDecimalにありますか、BigDecimalタイプで動作する類似のライブラリを知っていますか?あなたは、このように数をフォーマットしようとすることができ

答えて

2

まず修理詳細を読むことができます:

BigDecimal result = new BigDecimal(calc.getValue()).setScale(value1.getScale()); 

一つは、得られた二を取り、再びのBigDecimalに配置することができます。特殊ケース:乗算のスケールは、両方の係数のスケールの合計である(0.1 * 0.1 = 0.01)です。

ソリューション:Java Scripting API

使用。これはいくつかの言語に対応していますが、Java SEには十分なJavaScriptスクリプトが用意されています。

ScriptEngineManager manager = new ScriptEngineManager(); 
    ScriptEngine engine = manager.getEngineByName("nashorn"); 

    engine.put("var1", new BigDecimal("3.14")); 

    try { 
     engine.eval("print(var1.multiply(var1))"); 
     BigDecimal x = (BigDecimal) engine.eval("var1.multiply(var1)"); 
     double y = (Double) engine.eval("var1 * var1"); 
    } catch (ScriptException e) { 
     e.printStackTrace(); 
    } 
+0

ありがとうございます。経験豊富な人から新しいことを学ぶのは本当に良いことです。 –

+0

ありがとうございます!それは私が探していたようだ。 – Ksenia

1

calc.getValue()はdouble値である、ので

 NumberFormat numberFormat = new DecimalFormat("#0.00"); 
     System.out.println(numberFormat.format(calc.getValue())); 

、これは常に小数点以下2桁にそれをフォーマットします。

JEPを使用するユースケースはわかりませんが、単純減算はBigDecimalで直接処理できます。

 BigDecimal value1 = new BigDecimal("29250.24"); 
     BigDecimal value2 = new BigDecimal("263.21"); 
     System.out.println(value1.subtract(value2)); //28987.03 

あなたはそれがBigDecimal#subtract

+0

はい、正確な出力を得ることができますが、エラーを計算せずに正確な計算が必要です。 – Ksenia

+0

'numberFormat.format()'は数値を四捨五入します。例えば'28987.0390000002'は' 28987.04'にフォーマットされます 'エラーを計算せずに 'を意味しますか? –

+0

私は28987.0300000002ではなく、29250.24-263.21 = 28987.03を意味します。このエラーは 'double '型のために発生します。 – Ksenia

関連する問題