非常奇怪的行为:乘法给出了错误的答案

时间:2013-06-08 21:05:20

标签: c#

我有很奇怪的问题。我有一个应用程序,客户将输入qusntity和价格,然后程序将自动计算。问题是,在某些时候它给出了错误的数字,我有一个例子。之前,这是代码:

    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。

这是非常奇怪的行为。请帮忙!

最诚挚的问候。

3 个答案:

答案 0 :(得分:4)

永远不要使用double进行货币算术。双精度是浮点数,当执行数学运算时,有时在将其渲染回基数10以进行显示时会失去精度。这是因为数字如何在内存中表示浮点数。

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

这个SO问题有很多关于何时应该使用小数倍的双重讨论: When should I use double instead of decimal?

答案 1 :(得分:3)

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

此外,如果在循环中计算,这种小的偏差趋于增长。因此,例如,不是将某个值加10倍,而是最好将该值的十倍加一次。

答案 2 :(得分:-1)

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