2016-08-18 17 views
0

私がここで間違ったことを知っている人は誰ですか?私は浮動小数点数を持っている、それは0.04と言うように。フォーマット後、0.03になります。どうやら、出力結果はすでに0.01よりも低くなっています。事前にDecimalFormatが間違った結果を返します

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0; 
     DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
     decimalFormat.setRoundingMode(RoundingMode.FLOOR); 
     float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion)); 

     return Math.min(1.0f, formattedCreditAvailableProportion); 

ありがとう:

は、ここに私のコードです。

+2

'System.out.println(decimalFormat.format(0.04));' prints '0.04'; '0.04'よりも小さい値で呼び出しています(これは* float *から0.03になります)。 –

+0

@Long 'this.accountSummary.getCreditAvailable()'と 'this.accountSummary.getCreditLimit()'の値が分かれていることをあなたに見せてもらえますか? – mapeters

+0

フォーマットしないでください。 2小数点まで丸めます。あなたは大丈夫です。 –

答えて

0

これをデバッグする方法:

実行このコードを、それはあなたの問題を明確にする必要があります。

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0; 
System.out.println(creditAvailableProportion)    //Original value 
DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
decimalFormat.setRoundingMode(RoundingMode.FLOOR); 
String temp = decimalFormat.format(creditAvailableProportion); 
System.out.println(temp);          //formatted string 
float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion)); 
System.out.println(formattedCreditAvailableProportion);   //Parsed float. 

return Math.min(1.0f, formattedCreditAvailableProportion); 

がうまくいけば、これは少し魚にお教えします。

+0

私はこれが原因だと思っていますが、確かではありません:decimalFormat.setRoundingMode(RoundingMode.FLOOR); –

+0

まあ、正しい値を持たない最初の値はどの値ですか?私のコードでは、3つの値を出力する必要があります。あれは何だった? –

+0

温度が間違っています –

0

また、Math.floor()を試すこともできます。それを文字列に変換して使用しないでください。

float temp = 7.888888f; 
temp = temp * 100; 
     temp = (float) Math.floor((double)temp); 
     temp = temp /100; 
     System.out.println(temp); 
2

誰も問題を説明していないので、何が起こっているのか簡単に説明しましょう。 Javaを含むほとんどのシステムの浮動小数点数は正確ではありません。これは.04を意味し、内部的には.03999999999や.040000001などのように格納されます。したがって、フロア形式でフォーマットすると、.03で終わる場合があります。 解決方法は、丸め形式を使用するか、形式の前に.0000001を追加することです。そのようにしてもフロアはそれを正しく得るでしょう。
もう1つの方法は、できるだけ浮動小数点数を完全にダンプし、Androidがジオ座標を使用して行うのと同様の整数(1e6など)を使用することです。

関連する問題