直升机,
我正在申请管理C#中的预算,但我在舍入值方面遇到了很多问题。我得到的规格是用户可以输入含税和不含税的产品价值(在两个文本框中)。
因此,我正在制定一项功能,将价格从税价转换为不含税的价格和不含税的价格,以及含税的价格。
所以我将它附加到两个文本框的componentDidMount() {
this.loadData(this.props.match.params.userId);
//using redux and axios to get data
}
事件
TextChanged
private void txtPrecioTotal_TextChanged(object sender, EventArgs e)
{
if (!ignoreTextChanged)
{
decimal precio;
if (decimal.TryParse(txtPrecioTotal.Text, out precio))
{
precio = precio / (1 + IVATxt.Value / 100);
ignoreTextChanged = true;
txtPrecioBase.Text = precio.ToString("##.##");
ignoreTextChanged = false;
}
}
}
private void txtPrecioBase_TextChanged(object sender, EventArgs e)
{
if (!ignoreTextChanged)
{
decimal precio;
if (decimal.TryParse(txtPrecioBase.Text, out precio))
{
precio = precio * (1 + IVATxt.Value / 100);
ignoreTextChanged = true;
txtPrecioTotal.Text = precio.ToString("##.##");
ignoreTextChanged = false;
}
}
}
是阻止递归计算的ignoreTextChanged
问题在于计算不是那么精确,只有两位数。
假设bool
为IVATxt.Value
,例如我们在21
输入100
(含税价格),则会计算txtPrecioTotal
的价格(价格)没有税),但是如果我们在82,64
中输入该值,我们会得到txtPrecioBase
(含税价格),应该是99,99
。
有没有办法解决这个问题?
答案 0 :(得分:2)
计算:
82,64 * 1,21是99,9944(该轮次为99,99)
82,65 * 1,21是100,0065(向下舍入到100,01)
因此,没有办法用两位小数代表价格,当应用21%税时,这将导致100。如何解决这个问题在很大程度上取决于应用场景(也可能是法律要求)。以后用户或应用程序将使用该值做什么?
处理此问题的一些可能方法。请注意,这在很大程度上取决于应用场景,还考虑了如何对客户所在地区的某些税收进行计算的法律要求。
对于计算值,允许它们具有两个以上的小数位
当计算值仅用于提供信息而非进一步计算时,可以容忍使用不精确的值。
在我参与的一个项目中,我们允许凭证有一个标记,无论计算是基于净值还是总值。当凭证被标记为基于网络时,则用户输入净值。当凭证被标记为基于总额时,则用户输入总值。然后,税收计算仅应用于凭证的总和(相应地,具有相同税级的项目的总和)。
...
答案 1 :(得分:0)
最后以这种方式解决了问题:
设置为包含产品的实体,在两个文本框之一中计算的价格。此价格的精确度将高达5。继续我发布的示例,100
的价格与我之前提到的税额82.64
不含税,现在它将是82.64463
。如果我将该值应用于21%
的税,我现在获得值100,0000023
然后应用格式F2
或C2
我得到两位数的价格。继续该示例,先前步骤的结果将是100,00
,这是用户输入的价格。
感谢您的所有答案。