0

我有非常奇怪的问题。我有一个应用程序,客户将输入数量和价格,然后程序将自动计算。问题是它有时会给出不正确的数字,我有一个例子。之前,这是代码:

    void calculate_total()
    {
        int i;
        total_bill = 0;
        double pre_total;
        for (i = 0; i < row_count; i++)
        {
            TextBox[] textbox_item_array = new TextBox[6];
            textbox_item_array = (TextBox[])(item_textbox[i]);
            if (textbox_item_array[0].Text != "" && textbox_item_array[4].Text != "" && textbox_item_array[3].Text != "")
            {
                pre_total = System.Convert.ToInt32(textbox_item_array[4].Text) * System.Convert.ToDouble(textbox_item_array[3].Text);
                total_bill = total_bill + pre_total;
            }
        }
        if (double.TryParse(textbox_bill_discount.Text, out bill.bill_discount) == true)
        {
            textbox_bill_total.Text = total_bill.ToString();
            final_total = total_bill - bill.bill_discount;
            textbox_bill_final_total.Text = final_total.ToString();
        }
        else
        {
            textbox_bill_discount.Text = "";
            final_total = total_bill;
            textbox_bill_total.Text = total_bill.ToString();
            textbox_bill_final_total.Text = final_total.ToString();
        }
    } 

例如:如果价格是 3.8,数量是 12,答案应该是 45.6。然而,答案是:45.5555555559。

这真的是非常奇怪的行为。有什么可以帮忙的吗!!

此致。

4

3 回答 3

4

切勿使用 double 进行货币算术。double 是一个浮点数,在执行数学运算时,有时会在将其渲染回以 10 为底进行显示时失去精度。这是因为浮点数在内存中的表示方式。

您可以使用System.Decimal数据类型,这将使​​您的小数点保持货币准确。

这个 SO 问题有很多关于什么时候应该在小数上使用双精度的讨论: 我什么时候应该使用双精度而不是小数?

于 2013-06-08T21:08:33.777 回答
3

这只是浮点类型的有限精度问题。如果您比较值,则不能依赖“精确”值。您总是需要考虑某种“epsilon”差异。如果您搜索“比较浮点数”,则可能有很多关于此问题的参考。

此外,如果在循环中计算,这种小的偏差往往会增加。因此,与其将某个值相加 10 倍,不如将该值的 10 倍相加。

于 2013-06-08T21:07:59.767 回答
-1

不要将浮点用于定点数学。将变量更改为Decimal.

于 2013-06-08T21:10:13.267 回答