我的总价值不像计算器一样精确

时间:2019-02-06 09:19:54

标签: c#

在我的表格上计算出的总价值是错误的。 10800 - 10417 * 0.20 = 76.6是正确的值,但我的响应形式为8716.6?我在这里做错了什么?

我的表格总计为8716.60,而计算器上显示的正确值为76.6

    public void wwtax()
    {
        double tax = 0;          
        double value = 0;

        if (tax < 10417)
        {
            tax = Convert.ToInt32(label21.Text);//the 10800 value
            label20.Text = "0";
        }
        if (tax > 10417)
        {
            tax = Convert.ToInt32(label21.Text);
            value = tax - 10417 * 0.20;
        }
        if (tax >= 16777)
        {
            tax = Convert.ToDouble(label21.Text);
            value = tax - 16777 * 0.25 + 1250.00;
        }
        if (tax >= 33333)
        {
            tax = Convert.ToDouble(label21.Text);
            value = tax - 33333 * 0.30 + 5416.67;
        }
        if (tax >= 83333)
        {
            tax = Convert.ToDouble(label21.Text);
            value = tax - 33333 * 0.32 + 201416.67;
        }
        if (tax > 153846)
        {
            tax = Convert.ToDouble(label21.Text);
            value = tax - 153846 * 0.35 + 1001416.67;
        }
        label20.Text = value.ToString();
    }

2 个答案:

答案 0 :(得分:3)

您使用的计算器可能只是使用从左到右的规则,其中表达式结果基于从左开始首先遇到的任何运算符。

但是实际上,10800 - 10417 * 0.20 = 8716.60是正确的,而10800 - 10417 * 0.20 = 76.60是错误的。因为除非明确指定,否则乘法是在减法之前完成的。原因很简单。 BODMAS 规则。只需search it on the web或参阅一些小学书籍。

如果仍然需要答案来满足您的计算器的要求,则只需对要首先计算的表达式部分使用方括号。就您而言,10800 - 10417

因此,您的表情应为:value = ( tax - 10417 ) * 0.20;

答案 1 :(得分:2)

似乎,您应该更改if的顺序(从tax > 153846开始)并使用else if。错误计算的直接原因是省略了括号(tax - 10417) * 0.20m)

    // When working with money, Decimal is a better choice than Double
    decimal value = 0;

    // Let's pull out tax from all the if's
    decimal tax = Convert.ToDecimal(label21.Text);

    if (tax > 153846)
      value = (tax - 153846) * 0.35m + 1001416.67m;
    else if (tax >= 83333)
      value = (tax - 33333) * 0.32m + 201416.67m;
    else if (tax >= 33333)
      value = (tax - 33333) * 0.30m + 5416.67m;
    else if (tax >= 16777)
      value = (tax - 16777) * 0.25m + 1250.00m;
    else if (tax > 10417)
      value = (tax - 10417) * 0.20m;
    else 
      value = 0;  

    // "f2": let's ensure 2 digits after the decimal point (i.e. "100.00" for 100)
    label20.Text = value.ToString("f2");