c#添加浮点数表现得非常奇怪

时间:2013-10-05 18:34:48

标签: c# floating-point grid devexpress

我正在尝试添加行的单元格并在网格中的新单元格中显示总数。我正在使用DevExpress的gridControl。网格有12列代表一年中的月份,我想添加月份值并在第13列显示总数。

我的问题是,如果我的浮点值为“111,22”,它将被添加为“111,2188”到数据库,并且在第13个单元格中没有精确显示。

所以,我有两个问题。第一个是“为什么它将它作为111,2188插入数据库?”第二个是“为什么显示总数”。

这是我的代码......当我添加111,2188和200时会发生这种情况,我会得到211,2188 ......

private void calculate_gv_row_total(int row_index) {
    float total = 0;
    for (int j = 0; start_index + j < start_index + months; j++)
    {
        float f = float.Parse(gv.GetDataRow(row_index)[start_index + j].ToString());
        total = total + f;
    }
    gv.GetDataRow(row_index)[total_cell_index] = total;

}

我该如何解决这些问题?我做错了什么?

2 个答案:

答案 0 :(得分:4)

实际上,你的网格效率很高,它的结果是111,2188到111,22。如果要查看确切的值,请增加列宽或告诉网格精度级别。

如果您不需要那么精确地使用ToString("F")

private void calculate_gv_row_total(int row_index) {
    float total = 0;
    for (int j = 0; start_index + j < start_index + months; j++)
    {
        float f = float.Parse(gv.GetDataRow(row_index)[start_index + j].ToString("F"));
        total = total + f;
    }
    gv.GetDataRow(row_index)[total_cell_index] = total;

}

答案 1 :(得分:1)

正如Jon Skeet在评论中所说,问题是 - 直截了当地说 - 你对花车的理解。 float只使用32位来存储二进制浮点值,该值必须转换为十进制值。这会导致您遇到的“怪异”值。

最简单的解决方法通常是使用双打。但请仔细阅读浮点数以及为什么它们不能代表10号基数。