2011-01-14 27 views
0

私はプログラミングには慣れていて、パーセンテージで動作し、結果に応じてフォーマットされた答えを表示するプログラムを作成しようとしています。この場合奇妙な値を返すMod

if(percent % 1 == 0.0) 
{ 
    sw.Write(" {0}%", (int)percent); 
} 
else 
{ 
sw.Write((" {0:f1}%", percent); 

%値は、のように整数を表示11、14、12、6及び4のすべてではなく14であるが、14でそれは14.0のように表示されます。パーセントを見ると、数字は11.0 12.0などになりますが、14では14.000000000000004となり、正しく表示されません。これはいくつか気まぐれですか、それとも正しくプログラミングしていないのですか?よろしくバリー

+0

これは、%が特定の数字(7,14、または28ではなく21)である場合にのみ発生しているように見えます。他の数字はすべて正しいです。今私は本当に混乱しています!バレーリーにご注意ください – user575357

+0

パーセントはどのタイプですか?そして、あなたはどのように値を得ていますか? – Yogesh

+0

ここでの例では、パーセントの型がintまたはdoubleの場合、説明されている問題は発生しません。どのタイプがパーセントですか?実際に問題を示すためにあなたの例を変更できますか? –

答えて

0

あなたが後に固定されている場合は小数点以下では、これらを試してみてください。

sw.Write(string.Format("{0:0.00}", percent)); 

http://www.csharp-examples.net/string-format-double/

+0

ありがとう、それは非常に便利ですが、最終的な出力ではなく、私が望むやり方と比較するために数字を得ることに問題があるようです。よろしくバリー – user575357

1

あなたはoperator ==を使用して浮動値を比較すべきではありません。

私はいくつかのコードhereを掲示しました。

EDIT

フル例:コースの

class Program 
{ 
    static double epsilon = 0.000001; 

    static bool DoubleEquals(double value1, double value2) 
    { 
     return Math.Abs(value1 - value2) < epsilon; 
    } 

    static void Print(double percent, TextWriter sw) 
    { 
     if (DoubleEquals(percent % 1, .0)) 
     { 
      sw.Write(" {0}%", (int)percent); 
     } 
     else 
     { 
      sw.Write(" {0:f1}%", percent); 
     } 
    } 

    public static void Main(string[] args) 
    { 
     Print(11.0, Console.Out); 
     Print(14.000000000000004, Console.Out); 
     Print(12.0, Console.Out); 
     Print(6.0, Console.Out); 
     Print(4.0, Console.Out); 

     Console.Write("Press any key to continue . . . "); 
     Console.ReadKey(true); 
    } 

、あなたは十分に小さな値にepsilonを調整する必要があります。

+0

あまりにも機能しましたか? :) – Simone

+0

エディターに申し訳ありません。私はコードを試みたが、それは私のために働かなかった。私は(Double.Equals(%、0))を使用したとき、常に10進数でなければならず、(Double.Equals(percent、0)を使用すると常に10進数で表示されます。初心者として私はあまりにも多くを期待しています。 – user575357

+0

編集された回答を参照してください – Simone