簡體   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