1

LinqPadで実行した次のコードがあります。

void Main()
{
    List<VariableData> outputVariableData = 
    new List<VariableData>();

    for(int i = 1 ; i< 100; i ++)
    {
    outputVariableData.Add(new VariableData
        { 
        Id = i,
        VariableValue = .33     
        });
    }

    double result = outputVariableData.Average(dd=> dd.VariableValue);
    double add = outputVariableData.Sum(dd=> dd.VariableValue)/99;
    add.Dump();
    result.Dump();
}

public class VariableData
    {
        public int Id { get; set; } 
        public double VariableValue{ get; set; }
    }

結果

0.329999999999999
0.329999999999999

式=AVERAGE(A1:A101)を使用してExcelシートの同じ数値の平均を確認すると、そのまま.33が返されます。

実際、私はこのデータを使用してグラフを描画しており、平均値がグラフに表示されているため、グラフの描画が非常に少なくなり、グラフはそのようなタイプの値を管理できません。

私はこれら両方の出力について少し混乱しています、私は値を自動的に丸めるのに優れていると思います。だから私は私の拡張メソッドの出力が正しいという単純で少しばかげた質問がありますか?

4

4 に答える 4

3

前述のように、Excel は丸みを帯びた素敵なバージョンを提供します。数値を表示する場合、これは非常に役立つかもしれません: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

http://msdn.microsoft.com/en-us/library/f5898377も利用できます。

あなたが文字通り尋ねる標準的な数値フォーマット文字列の関連性は何ですか?

簡単です - 問題は数値が間違っていることではありません- 浮動小数点数の不正確さを考えると、まったく問題ありません。ただし、これらの数値を表示することは問題になる可能性があります。これは期待どおりではなく、有用でもありません。ただし、数値の表示方法を定義するのに数秒かかると...

void Main()
{
    List<VariableData> outputVariableData = 
    new List<VariableData>();

    for(int i = 1 ; i< 100; i ++)
    {
    outputVariableData.Add(new VariableData
        { 
        Id = i,
        VariableValue = .33     
        });
    }

    double result = outputVariableData.Average(dd=> dd.VariableValue);
    double add = outputVariableData.Sum(dd=> dd.VariableValue)/99;
    add.Dump();
    add.ToString("P0").Dump();
    add.ToString("N2").Dump();
    result.Dump();
    result.ToString("P0").Dump();
    result.ToString("N2").Dump();
}

public class VariableData
{
        public int Id { get; set; } 
        public double VariableValue{ get; set; }
}

突然、必要な出力が得られます。

0.329999999999999
33 %
0.33

0.329999999999999
33 %
0.33

問題は、数値を完全に操作しようとしたり、異常なデータ型を使用したりすることではなく、利用可能なオプションを見つけ出し、それらを利用することに数分を費やすことです! それは簡単で、長期的には非常に便利です:)

もちろん、これはデータの表示にのみ使用する必要があります。計算上の理由でデータを丸める必要がある場合は、Math.Round などを調べることをお勧めします。

これがあなたのQに答えることを願っています.

補足:

これは、非常によく似た方法で機能する別のオプションです。 http://msdn.microsoft.com/en-us/library/0c899ak8.aspx 次のような方法を説明しています

void Main()
{
    0.31929.ToString("0.##%").Dump();
    0.ToString("0.##%").Dump();
    1.ToString("0.##%").Dump();
}

結果は次のとおりです。

31.93%
0%
100%
于 2012-07-19T13:41:27.787 に答える
2

コンピューターは浮動小数点数をバイナリ形式で格納し、0.33 の正確な表現はありません。

Decimal Binary
2       10
0.5     0.1
0.25    0.01
0.33    0.01010100011110101110000101000111101011100001010001111010111000...

http://www.exploringbinary.com/binary-converter/

于 2012-07-19T14:42:50.010 に答える
1

これはまさに、コンピューターが数学ポイントから計算を提示できる方法です。数値 0.33 と 0.32(9) は等しく、Excel にはおそらく独自の丸めがあります。

http://www.cut-the-knot.org/arithmetic/999999.shtml

于 2012-07-19T13:37:00.523 に答える
0

浮動小数点を使用すると、丸めの差が生じます。それは起こります。

正確な数値が必要な場合は、VariableValue に double ではなく decimal を使用してみてください。 これにより、 addresult
の両方で 0.33 が得られます。

于 2012-07-19T13:39:24.017 に答える