Groovy vs Java - 浮点精度的差异

时间:2018-04-19 05:35:39

标签: java groovy floating-accuracy

这里浮点精度差异的原因是什么?

def "emi test"(){
        given:
        def P =  6000000.00
        def n = 20 * 12
        def r = (8.35/12)/100

        double emi_g = (P * r * (1+r).power(n))  / ((1+r).power(n) - 1)
        double emi_j= (P * r * Math.pow(1+r,n)) / (Math.pow(1+r,n)-1);
        expect:
        emi_g == emi_j
    }

结果:

emi_g == emi_j
|     |  |
|     |  51501.177737160346
|     false
51501.177737160666

2 个答案:

答案 0 :(得分:2)

差异由结果的数据类型解释。

在shell中运行时,结果的类型为:

groovy:000> emi_g.getClass()
===> class java.math.BigDecimal
groovy:000> emi_j.getClass()
===> class java.lang.Double

Groovy的实现返回BigDecimal,其精度高于Double

答案 1 :(得分:0)

问题与类型有关。

from dicamsdk import __version__评估为(1 + r).power(n) - 1

BigDecimal评估为P * r * (1 + r).power(n)

BigDecimal评估为P * r * Math.pow(1 + r, n)

Double评估为Math.pow(1 + r, n) - 1

目前尚不清楚您的要求是什么以及您是否关心精度丢失,并且了解这些要求有助于描述如何获得所需的行为。被问到的问题的答案......

  

浮点精度差异的原因可能是什么   这里吗?

是因为表达式评估为不同类型以及与Double除以Double相关的规则(以及您是分子和分母值的事实在Double中首先,与Double相反,导致你失去一些精确度。