2015-10-15 114 views
0

我正在使用使用mm和inches繪製縮放圖形的應用程序。我需要從一個轉換到另一個,而不會損失精度。我正在努力爭取準確性,並轉向Apfloat軟件包。有人可以解釋...如果我從100mm開始,將其轉換爲英寸,然後再回到Mm,爲什麼我會失去精度?瞭解Apfloat及其精度

public static void main(String[] args) { 

    Apint mm = new Apint(100); 
    System.out.println("mm = " + mm); 

    // 25.4mm in 1 inch 
    Apfloat toInches = new Apfloat("25.4"); 

    // 100mm/25.4 = x-Inches  
    Apfloat inches = mm.divide(toInches); 
    System.out.println("mm - > Inch = " + inches); 

    // x-Inches x 25.4 = 100mm 
    Apfloat backToMm = inches.multiply(toInches); 
    System.out.println("Inch - > mm = " + backToMm); 
} 

輸出:

mm = 100 
mm - > Inch = 3.93 
Inch - > mm = 9.99e1 


無論我有多大設置精度財產我仍然得到重現9.999 ...

+0

聽起來像是一個浮點舍入錯誤給我。 – Powerlord

+0

@Powerlord我同意,但我導致相信這個特定的包是準確的,並且比BigDecimal更受歡迎。 – cworner1

回答

0

OK,我不熟悉Apfloat,所以我開始閱讀它的文檔。

顯然,如果您使用public Apfloat(String value)構造函數,則該數字的精度就是該字符串中的位數。

在這種情況下,您已經指定了「25.4」,它是3位數字。

但是,要解決此問題,可以使用允許指定精度的public Apfloat(String value, long precision)構造函數,以便處理具有更多小數位數的數字。

+0

我把精度設置爲100,它返回:9.99999999999999999999 ...等等。 – cworner1

0

舍入模式未定義。要獲得四舍五入的結果,請使用ApfloatMath.round()