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 表中相同数字的平均值时,它返回 0.33。

实际上,我正在用这些数据绘制图表,并且图表上显示了平均值,这使得图表绘制如此抽象,并且图表无法管理这种类型的值。

我对这两者的输出有点困惑,我想 excel 会自动舍入该值。所以我有一个简单而愚蠢的问题,即我的扩展方法的输出是否正确?

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 等。

希望这能回答你的问题。

补充:

这是另一个以非常相似的方式工作的选项: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 使用小数而不是双精度。
这为addresult提供了 0.33 。

于 2012-07-19T13:39:24.017 回答