如何将值舍入到只有3个小数点?

Ahs*_*ain 2 .net c# types visual-studio

我正在处理库存软件,并且还按百分比和金额计算折扣.

  • 意味着当我输入%金额时它会自动转换为价格#
  • 当我输入价格时,它会自动转换为%#

我用来转换价格%的代码是这样的:

if(txtDiscount.Text == "" || txtGrandTotal.Text == "")
            {
                MessageBox.Show("Please Enter amount in Grand Total",Application.ProductName,MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
            else
            {
              //  double percent;
                double grandTotal;
                double per;
                double txDiscount;

                //percent = Convert.ToInt32(txtPercant.Text);
                grandTotal = Convert.ToInt32(txtGrandTotal.Text);
                txDiscount = Convert.ToInt32(txtDiscount.Text);


                per = txDiscount / grandTotal * 100;

                //per = percent / 100 * grandTotal;

                if (per % 3 != 0)
                    per = (per - per % 3) + 3;


                txtPercant.Text = Convert.ToString(per);

                    ................
                    ................
                    ................
                    ................
                    ................
Run Code Online (Sandbox Code Playgroud)

现在让我们假设如果我输入的金额是"25",那么它计算的百分比是"2.77777777777778".我想把它限制在点之后的三位小数,就像我想成为"2.778"或者我想在点之后只显示3位小数的任何意思,任何人都可以帮助我以哪种方式做到这一点?任何建议,将不胜感激!!

编辑:

从价格到%代码的转换是:

  private void txtDiscount_Leave(object sender, EventArgs e)
        {  
            if(txtDiscount.Text == "" || txtGrandTotal.Text == "")
            {
                MessageBox.Show("Please Enter amount in Grand Total",Application.ProductName,MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
            else
            {
              //  double percent;
                double grandTotal;
                double per;
                double txDiscount;

                //percent = Convert.ToInt32(txtPercant.Text);
                grandTotal = Convert.ToInt32(txtGrandTotal.Text);
                txDiscount = Convert.ToInt32(txtDiscount.Text);


                per = txDiscount / grandTotal * 100;

                //per =  Math.Round(per, 3);
                per = Math.Truncate(per * 1000) / 1000;

                txtPercant.Text = Convert.ToString(per);








                double lblgrandTotal = 0.0;
                double Disconunt = 0.0;
                double netTotal = 0.0;

                lblgrandTotal = Convert.ToDouble(txtGrandTotal.Text);
                Disconunt = Convert.ToDouble(txtDiscount.Text);
                netTotal = grandTotal - Disconunt;

            //netTotal = Convert.ToInt32(grandTotal) - Convert.ToInt32(Discount);

            lblNetTotal.Text = Convert.ToString(netTotal);

            }
        }
Run Code Online (Sandbox Code Playgroud)

从%到价格代码的Cobersion是:

   private void textBox1_Leave(object sender, EventArgs e)
        {
            if (txtPercant.Text == "")
            {
                MessageBox.Show("Please Enter value in Percenent", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                double percent;
                double grandTotal;
                double per;

                percent = Convert.ToDouble(txtPercant.Text);
                grandTotal = Convert.ToDouble(txtGrandTotal.Text);

                per = percent / 100 * grandTotal;

                txtDiscount.Text = Convert.ToString(per);

                double lblgrandTotal = 0.0;
                double Disconunt = 0.0;
                double netTotal = 0.0;

                lblgrandTotal = Convert.ToDouble(txtGrandTotal.Text);
                Disconunt = Convert.ToDouble(txtDiscount.Text);
                netTotal = grandTotal - Disconunt;

                //netTotal = Convert.ToInt32(grandTotal) - Convert.ToInt32(Discount);

                lblNetTotal.Text = Convert.ToString(netTotal);
            }
        }
Run Code Online (Sandbox Code Playgroud)

但我面临的问题是我正在将%转换为价格和Vise Versa,现在以防万一我在12中加价12.33%,当我把12.33%转换回11.997价格时这是不一样的ans它应该是...它应该是12而不是11.997 ...真的很困惑.. !!

注意:

按价格我的意思是我计算总折扣的百分比折扣和价格折扣,意味着如果我增加12%然后它计算总额的价格折扣,如果我输入价格金额,那么它计算总额的百分比折扣

Jon*_*nna 10

Math.Round(per, 3)

但是,您的方法中存在两个逻辑错误.您正在使用double处理适用于它的金额和百分比.

double 适合与现实世界中的自然物一起使用,例如你的鼻子长度,或被逮捕的名人与Twitter上出现的关于它的笑话之间的秒数.

金钱和百分比折扣不是自然的东西,而是基于特定编号系统的人为金额.

几乎所有这些都是十进制的,除了毛里塔尼亚的ouguiyas,马达加斯加的ariaries和马耳他的scudo,以及几种过时的货币(如旧的英镑,先令和便士).在当前时间使用的三个中,前两个基于base-5(并且在十进制系统中可以表示没有错误),并且最后一个与欧元挂钩,所以不必担心它.

现在,当我们处理现实世界时,我们会遇到问题,因为我们的编号系统处于特定的基础,因此我们得到了类似的结果0.33333333333333333333333333333.

有钱,我们只能通过分裂得到这些错误,因为除非我们分裂,否则什么都不会对我们造成基数限制错误.

但是double内部不使用十进制,它使用二进制.二进制具有不同的数字,导致该点后的循环数字.例如0.10.01.大多数情况下,所涉及的舍入错误将被取消,但有时它们不会.

因此,在处理金钱时,总是使用decimal而不是double除非你有一个很好的理由(如果你不能解释为什么上述情况不适用于你的情况,那么你就不会).

第二个问题是,由于你正在做百分比,你正在进行分工,所以你仍然会得到一些舍入错误.

解决方案是存储多于您需要的小数位数.例如,如果你想精确到3位小数(如你所说),那么存储4.

例如,如果在某个时刻我们将12除以7并四舍五入到三个点,我们将得到1.714.如果我们再次乘以7,我们将得到11.998.然而,如果我们存储了四位小数1.7143并且只显示了1.714,那么再次乘以7会得到我们显示的12.0001(再次舍入到3位)为12.

我们无法避免舍入错误,但我们可以在更高的精度下工作,直到最新时刻为止,因此舍入错误本身会丢失到四舍五入.

  • 好故事,你应该写一本关于这个主题的书。:) (4认同)