2013-08-26 25 views
0

我有這樣的一段代碼,「文本」是被迫例如值longBitsToDouble,沒有舍入,這可能

public static String binStringToRealString(String text, int precision) { 
    String result = ""; 
    long longBits; 
    Double doubleValue; 

    text = "0011111111110001100110011001100110011001100110011001100110011010"; 

    longBits = Long.parseLong(text, 2); 
    Log.d(TAG, "longBits = " + longBits); 
    // longBits = 4607632778762754458 

    doubleValue = Double.longBitsToDouble(longBits); 
    Log.d(TAG, "doubleValue = " + doubleValue); 
    // doubleValue = 1.1 

    result = doubleValue.toString(); 
    Log.d(TAG, "result = " + result); 

    return result; 
} 

我能以某種方式得到不圓的doubleValue?

實際值是1.10000000000000008881784197001

如在此轉換器 http://www.binaryconvert.com/result_double.html?hexadecimal=3FF199999999999A

我應該怎麼做,以阻止四捨五入?

回答

1

double將不顯示該精度的度量。您將不得不使用類似BigDecimal的東西。只需做(new BigDecimal(doubleValue)).toString()來填充你的result就可以做到。但是您從String表示得到的數字是1.100000000000000088817841970012523233890533447265625,這是22超過您發佈的確切數值的額外數字。

編輯:事實上,MathContext類型的BigDecimal構造函數玩弄我無法得到您發佈的確切值(即具有這麼多數字的值),所以我不確定該值如何計算。

Your exact value  -> 1.10000000000000008881784197001 
MathContext.DECIMAL64 -> 1.100000000000000 
MathContext.DECIMAL128 -> 1.100000000000000088817841970012523 
MathContext.UNLIMITED -> 1.100000000000000088817841970012523233890533447265625 
+0

我想你的結果比一個網站更好,他們可能會在某個時候切斷它。謝謝! – Milan