非常奇怪的行为:乘法给出错误的答案
本文关键字:出错 错误 答案 非常 | 更新日期: 2023-09-27 18:17:27
我有很奇怪的问题。我有一个应用程序,其中客户将输入数量和价格,然后程序将自动计算。问题是有时它会给出不正确的数字,我有一个例子。之前,这是代码:
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。
这真是非常奇怪的行为。请帮忙!!致以最亲切的问候。
永远不要在货币运算中使用double。双精度数是一个浮点数,在执行数学运算时,有时会在将其呈现回以10为基数显示时失去精度。这是因为浮点数在内存中的表示方式不同。
你可以使用系统。十进制数据类型,它将保持货币的小数点准确。
这个问题有很多关于什么时候应该在小数上使用double的讨论:什么时候我应该用双进位而不是十进制?
这只是浮点类型精度有限的问题。如果比较值,则不能依赖于"精确"值。你总是需要考虑一个特定的"差"。如果你搜索"比较浮点数",可能会有很多关于这个问题的参考资料。
此外,如果在循环中计算,这种小的偏差倾向于增长。因此,例如,与其将某个值添加10倍,不如将该值的10倍添加1倍。
不要在定点数学中使用浮点数。将变量改为Decimal