2011-08-05 41 views
0

我有一段非常簡單的代碼,我認爲從用戶的角度來看錯誤的結果。爲什麼Java在浮點計算後顯示額外的值?

package com.test.sample; 
public class Test { 

    public static void main(String[] args) { 
     float c,d; 

     c = (float) 12.47; 
     d = (float) 12.44; 
     d = c - d; 

     System.out.println("Hello the calculated value of a=" + d); 
    } 

} 

輸出是 Hello the calculated value of a=0.030000687

但我想a=0.030000000這是一個完美的價值。

+4

歡迎來到浮點數奇蹟!如果您真的感興趣,您應該閱讀以下內容:http://download.oracle.com/docs/ cd/E19957-01/806-3568/ncg_goldberg.html – Fred

+0

float在二進制中是最接近可能的表示形式......它不可能是精確的,所以不完美。你知道,積累的錯誤最終註定了黑客帝國。 – Nishant

+2

Look [Machine Precision](http://en.wikipedia.org/wiki/Floating_point#Machine_precision)它不是Java特定的。 – Nishant

回答

6

Floating point arithmetic,開發者應該知道什麼。

JVM執行IEEE-754 1985 floating point standard,它有它的accuracy problem(因爲浮點數不能精確地表示所有實數)。

如果您要求準確性,請改爲使用java.math.BigDecimal對象。


更新:我這是怎麼了你的榜樣,並使用BigDecimal實現你預期結果:

import java.math.BigDecimal; 

/** 
* @author The Elite Gentleman 
* 
*/ 
public class BigDecimalTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     BigDecimal a = new BigDecimal(Float.toString(12.47f)); 
     BigDecimal b = new BigDecimal(Float.toString(12.44f)); 
     BigDecimal c = a.subtract(b); 
     System.out.println(c); 
    } 
} 
+0

那麼最新的解決方案? – Vins

+1

+1解決方案。很多人只是'浮點不準確,閱讀' – Fred

+1

@Fred,是真的,因此我們爲什麼在這裏。提供解決方案(並得到更好的代表):-) –

-1

這個作品真的很好: Float.parseFloat(的String.format( 「%.2f」,floatValue)