2016-06-24 108 views
0

我想字符串 「0.955000」 轉換爲 「0.96」 使用Java的DecimalFormatJava的BigDecimal的問題

這裏是我的代碼片段:

String inputVal = "0.955000"; 
DecimalFormat decFmt = new DecimalFormat("0.00") 
decFmt.setRoundingMode(RoundingMode.HALF_UP); 
String outputVal = decFmt.format(Double.valueof(inputVal)); 

這裏我得到的輸出值爲 「0.95」。 我期待輸出爲「0.96」。有人知道我的代碼中有什麼問題嗎? 有沒有辦法,我可以得到「0.96」使用十進制格式。

+8

您的標題討論'BigDecimal'問題,但您的代碼不使用它。你需要什麼幫助? – Tunaki

+1

爲了解決@Tunaki的問題,如果您使用BigDecimal,您可以使用'.setScale(..)'方法並完成您想要的任務。 – lucasvw

+1

Ahem,雙精度。 –

回答

2

這是我嘗試的代碼:

import java.math.RoundingMode; 
import java.text.DecimalFormat; 


public class Test 
{ 
    public static void main(String[] args) 
    { 
    String inputVal  = "0.955000"; 
    DecimalFormat decFmt = new DecimalFormat("0.00"); 
    decFmt.setRoundingMode(RoundingMode.HALF_UP); 
    String outputVal = decFmt.format(Double.valueOf(inputVal)); 
    System.out.println(outputVal); 
    } 
} 

我被使用JDK 7的輸出是0.96但JDK 8我得到0.95。

這是爲什麼:0.955的雙重IS:0.9549999833106995在IEEE二進制格式

圓半升將變爲:0.95這是正確的答案。

+1

當我使用1.8版本運行代碼時,得到0.95 .0_40 – azurefrog

+0

這與以下問題類似: http://stackoverflow.com/questions/30778927/roundingmode-half-down-issue-in-java8 – Wael

+0

感謝您的回答。現在得到了這個問題。 –

0

發現此問題。早些時候,我嘗試使用Java 7並獲得0.96。現在更改爲Java 8後,我將其作爲0.95。我認爲這是一個Java版本問題。對於Decimal格式,Java 7和8的行爲不同。

+0

正確的輸出是0.95而不是0.96,這是因爲double以IEEE二進制格式存儲。看到我上面的更新 – Wael