1

我有这个 switch 语句,每次将双 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;
    }
}

任何人都知道为什么会发生这种奇怪的行为以及如何解决它?

4

1 回答 1

2

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

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

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

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

如果你绝对不能切换到十进制,你可以做类似的事情。如果 MyDouble 在零的 Epsilon 范围内,其中 Epsilon 是 0.00001 附近的常量,则将您的值强制为零。99% 的情况下不建议这样做。你真的必须使用 Decimal 作为货币,否则你最终会向客户收取错误的金额或遭受看似随机的错误。

于 2013-02-12T04:34:05.560 回答