winforms C#:在DataGridView单元格中将两个数字相乘不会返回精确的结果

ctrmrzij  于 2023-10-23  发布在  C#
关注(0)|答案(1)|浏览(167)

在一个应用程序中,我正在使用Winforms,我试图将datagridview中的两个单元格相乘并获得总值(数量 * 价格=总)问题是结果不精确

示例:

就像你在屏幕截图上看到的价格是3.469,99,但是当我乘以一个1得到3.470,00。必须是3.469,99

我的代码如下:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (dataGridView1.Rows.Count > 0)
        {
            if (e.ColumnIndex == 1)
            {
    
                if (int.TryParse(dataGridView1.Rows[e.RowIndex].Cells[1].Value?.ToString(), out int qty))
                {
                    var price = dataGridView1.Rows[e.RowIndex].Cells[2].Value;
                    var total = dataGridView1.Rows[e.RowIndex].Cells[3];
     
                    decimal result = qty * (decimal) price; // <--- HERE 
    
                    total.Value = result;
                }
            }
    
        }

}

更新:

rslzwgfq

rslzwgfq1#

“Total”列的DataType很可能是int,但应该是decimal
例如,这将创建与屏幕截图相同的行为:

DataGridView dgv = new DataGridView { Dock = DockStyle.Fill };
DataTable table = new DataTable();
table.Columns.Add("Total", typeof(int)); // <- this should be decimal
dgv.DataSource = table;
Form ff = new Form();
ff.Controls.Add(dgv);
ff.Load += delegate {
    dgv.Columns[0].DefaultCellStyle.Format = "n2";
    int qty = 1;
    double price = 3469.99;
    decimal result = qty * (decimal) price;
    table.Rows.Add(new Object[] { result });
};
Application.Run(ff);

另一种可能性是你的价格是3469.99499999995。
这导致价格为3469.99美元,总额为3470.00美元。
例如:

DataGridView dgv = new DataGridView { Dock = DockStyle.Fill };
DataTable table = new DataTable();
table.Columns.Add("Price", typeof(double));
table.Columns.Add("Total", typeof(decimal));
dgv.DataSource = table;
Form ff = new Form();
ff.Controls.Add(dgv);
ff.Load += delegate {
    dgv.Columns[0].DefaultCellStyle.Format = "n2";
    dgv.Columns[1].DefaultCellStyle.Format = "n2";
    int qty = 1;
    double price = 3469.994999999995;
    decimal result = qty * (decimal) price;
    table.Rows.Add(new Object[] { price, result });
};
Application.Run(ff);

相关问题