如何在Symja中修复精度?

时间:2018-08-07 13:56:02

标签: java precision symja

我正在使用Symja

http://matheclipse.org/上,当我运行以下公式时:

round(100*17347*0.047)*0.01

我得到:815.31

运行以下Java代码时

ExprEvaluator exprEvaluator = new ExprEvaluator(false,100);
double d = exprEvaluator.evalf("round(100*17347*0.047)*0.01");
System.out.println(d);

我得到:815.3100000000001

我想念什么?

1 个答案:

答案 0 :(得分:1)

代码没有错误。如果您只希望得到数字的2精度,我的意思是打印,请使用printf()代替println()

ExprEvaluator exprEvaluator = new ExprEvaluator(false,100);
double d = exprEvaluator.evalf("round(100*17347*0.047)*0.01");
System.out.printf("%.2f\n", d);

或者,如果需要其数字舍入值,则可以使用Java的DecimalFormat

double d = 815.3100000000001;
System.out.println(d);

DecimalFormat newFormat = new DecimalFormat("#.##");
double twoDecimal =  Double.valueOf(newFormat.format(d));
System.out.println(twoDecimal);

甚至,如果您对它的行为不满意,请覆盖evalf方法并在其中使用Math.round(...)。它可以实现您的愿望,而无需其他Java方法。此外,您应该看一下evalf的实现。