使用BigDecimal时Groovy可以替代Java吗?

时间:2010-04-23 15:10:24

标签: java scala groovy evaluation bigdecimal

我刚刚完成了对Java,Groovy和Scala的评估。

我考虑的因素是:可读性,精确度

我想知道的因素:性能,易于集成

我需要一个BigDecimal级别的精度。

以下是我的结果:

爪哇

void someOp()
{
    BigDecimal del_theta_1 = toDec(6);
    BigDecimal del_theta_2 = toDec(2);
    BigDecimal del_theta_m = toDec(0);

    del_theta_m = abs(del_theta_1.subtract(del_theta_2))
      .divide(log(del_theta_1.divide(del_theta_2)));

}

Groovy的

void someOp()
{
 def del_theta_1 = 6.0
 def del_theta_2 = 2.0
 def del_theta_m = 0.0

 del_theta_m = Math.abs(del_theta_1 - del_theta_2) / Math.log(del_theta_1 / del_theta_2);
}

Scala的

def other(){
 var del_theta_1 = toDec(6);
 var del_theta_2 = toDec(2);
 var del_theta_m = toDec(0);
 del_theta_m = (
  abs(del_theta_1 - del_theta_2)  
  / log(del_theta_1 / del_theta_2)
 )
}

请注意,在Java和Scala中,我使用了静态导入。

爪哇: 优点:它是Java
缺点:没有运算符重载(很多方法),几乎不可读/可编码

Groovy的: 优点:默认BigDecimal表示没有可见的输入,最不令人惊讶的BigDecimal支持所有操作(包括分区)
缺点:另一种学习语言

Scala的: 优点:有BigDecimal的运算符重载
缺点:一些令人惊讶的分裂行为(用Decimal128修复),另一种学习语言

2 个答案:

答案 0 :(得分:4)

BigDecimal的核心在每种语言中都是相同的。如果性能的限制因素是BigDecimal中的数学运算,则三种语言之间没有区别,因为它们都使用java.math.BigDecimal。

因此,请使用最容易阅读和理解的语言(可能不是java)。

答案 1 :(得分:1)

如果你的代码的主要核心是很多BigDecimal数学,那么Java就不是正确的语言IMO。您需要运算符重载。

我希望Java的未来版本允许系统定义的运算符重载内置数字类型,以使这种用例可用。

由于所有这些语言都在JVM上运行,因此您当然可以使用正确的语言完成高级数学运算,并将Java用于其他所有语言。这将最大限度地减少“学习另一种语言”的方面。