使用双打的奇怪行为

时间:2013-02-12 04:29:32

标签: c# .net-4.0 double switch-statement

我有这个switch语句,每次将double itemCost(最初为0.80)减少0.20。当它达到0.00我想执行一些代码。它工作正常,直到达到0.00但不是0.00 itemCost变为5.55111512312578E-17。

按下执行switch语句的按钮时,itemCost的输出值为:

0.60, 0.40, 0.20, 5.55111512312578E-17, -0.20, -0.40 etc

代码:

switch (codeString)
{
    case "20":
    {
        userAmount = userAmount + 0.20;
        itemCost = itemCost - 0.20;
        Console.WriteLine("" + itemCost);
        if (itemCost == 0.00)
        {
            giveChange();
            labelInstructions.Text = "giveChange";
        }
        else
        {
            string tempString = string.Format("{0:N2}", itemCost);
            labelInstructions.Text = "Please insert £" + tempString;
        }
        break;
    }
}

任何人都知道为什么会出现这种奇怪的行为以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

由于您正在处理货币,因此您应该切换并使用Decimal datatype

当你接近0.0时,浮点数和双打在处理加法和减法时遇到非常非常奇怪的行为。

当您需要绝对精度时,在所有平台上编程时要非常警惕浮点数学,这一点至关重要。例如,游戏开发者是 由于图形卡,图形库和性能限制,强制使用浮点。通常,当他们想要查看值是否为零时,而不是与零进行比较,他们会执行以下操作(伪代码)

if AbsoluteValue(MyValue) < 0.001 then  //assume MyValue is zero.  

如果你绝对不能切换到十进制,你可以做类似的事情。如果MyDouble位于Epsilon of Zero,其中Epsilon是0.00001附近的const,那么强制你的值为零。不推荐这是99%的场景。你真的必须使用十进制货币,否则你最终会向客户收取错误的金额或遭受看似随机的错误。