繁体   English   中英

Groovy与Java-浮点精度的差异

[英]Groovy vs Java - difference in floating point 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

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

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

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

Groovy的实现返回一个BigDecimal ,它的精度比Double

问题与类型有关。

(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

目前尚不清楚您的要求是什么,以及您是否在乎精度的损失,知道这些要求将有助于描述如何获得所需的行为。 按要求回答问题...

这里浮点精度不同的原因可能是什么?

就是因为表达式的计算结果不同类型和与分割相关联的规则DoubleDouble (而事实上,你是在分子和分母的值是一个Double首先,相对于BigDecimial ),因为你失去一些精度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM