c# - 如何将值四舍五入到小数点后三位?

标签 c# .net visual-studio types

我正在开发一个库存软件,同时也在按百分比和金额计算折扣。

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

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

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);

                    ................
                    ................
                    ................
                    ................
                    ................

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

编辑:

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

  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);

            }
        }

从 % 到价格代码的 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);
            }
        }

但我面临的问题是我将 % 转换为价格和 Vise Versa,现在如果我在价格中添加 12,它表示 12.33%,当我输入 12.33% 时,它会转换回 11.997Price,但不是应该是一样的...应该是 12 而不是 11.997...真的很困惑..!!

注意:

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

最佳答案

Math.Round(per, 3)

但是,您的方法有两个逻辑错误。您正在使用 double 来处理金额和应用于它的百分比。

double 适用于现实世界中的自然事物,例如 Nose 的长度,或者名人被捕与有关它的笑话出现在 Twitter 之间的秒数。

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

除了毛里塔尼亚乌吉亚、马达加斯加阿里亚斯和马耳他斯库多,以及一些过时的货币(如旧英镑、先令和便士),几乎所有这些货币都是基于小数的。在当前使用的三个中,前两个基于 5 进制(因此在十进制系统中可以毫无错误地表示),最后一个与欧元 Hook ,因此无需担心。

现在,当我们处理现实世界时,我们会遇到问题,因为我们的编号系统是在一个特定的基础上,所以我们得到像 0.33333333333333333333333333333 这样的结果。

有了钱,我们只能用除法来犯这些错误,因为除非我们除法,否则没有什么会迫使我们犯下基本限制错误。

但是 double 内部不使用十进制,它使用二进制。二进制有不同的数字,导致点后的循环数字。例如。 0.10.01。大多数情况下,所涉及的舍入误差会抵消,但有时不会。

因此,在处理金钱时,请始终使用 decimal 而不是 double 除非你有很好的理由(如果你不能解释为什么上面没有' t 适用于您的情况,则您不适用)。

第二个问题是,因为你在做百分比,所以你在做除法,所以你仍然会得到一些舍入误差。

解决方案是多存储一位小数位。例如。如果您想精确到小数点后 3 位(如您所说),则存储 4。

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

我们无法避免舍入误差,但我们可以在更高的精度下工作,直到需要的最后一刻,因此舍入误差本身会丢失到舍入中。

关于c# - 如何将值四舍五入到小数点后三位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355132/

相关文章:

.net - 隐藏链接 url

C# 与 Visual Studio : Published App Cannot Run After Installation

c# - 将 Microsoft.Azure.ServiceBus 替换为 Azure.Messaging.ServiceBus

c# - 为什么使用泛型的 "Equals"方法解析与显式调用不同

c# - 比较互联网上的两个文件是否相同

asp.net - 如何使用 VS 2008 和 IE 完全禁用 JavaScript 错误

vb.net - Visual Basic 问题 - Me.Hide() 或 Me.Close()

c# - 在多态中只有派生类可以是基类,这里发生了什么?

c# - 如何根据listitem对arraylist进行排序

c# - 让 ServiceStack 示例工作