Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将双数据类型的财务值精确舍入到C中的小数点后2位#_C#_Double_Rounding - Fatal编程技术网

C# 将双数据类型的财务值精确舍入到C中的小数点后2位#

C# 将双数据类型的财务值精确舍入到C中的小数点后2位#,c#,double,rounding,C#,Double,Rounding,我们使用这些双值来表示账单金额。我读到使用“decimal”数据类型比使用double数据类型更好,以最大限度地减少舍入误差。但这是一个非常大的项目,将所有数据类型更改为decimal是一项艰巨的任务。 所以我们尝试了数学。用两种中点取整进行取整,但都不起作用。存在某种错误。 有没有办法精确到小数点后2位 编辑: 抱歉,没有提供示例。问题是,一旦值(总共有24个“双精度”值)在四舍五入之前添加(它们最初最多为15位),求和值将达到所需的18167.04。但当它们四舍五入到小数点后2位时(使用Ma

我们使用这些双值来表示账单金额。我读到使用“decimal”数据类型比使用double数据类型更好,以最大限度地减少舍入误差。但这是一个非常大的项目,将所有数据类型更改为decimal是一项艰巨的任务。 所以我们尝试了数学。用两种中点取整进行取整,但都不起作用。存在某种错误。 有没有办法精确到小数点后2位

编辑:
抱歉,没有提供示例。问题是,一旦值(总共有24个“双精度”值)在四舍五入之前添加(它们最初最多为15位),求和值将达到所需的18167.04。但当它们四舍五入到小数点后2位时(使用Math.Round或Math.Round和中点四舍五入),求和值为18167.07(相差0.03)

使用Decimal数据类型适合于货币计算,但由于它是一个庞大的项目,因此目前,实现数据类型的更改是一项任务。 没有办法取整。 这里的数据类型真的存在问题还是因为舍入?
如果使用十进制数据类型,同样的舍入方法是否有效?

浮点精度不是由小数点定义的,而是由有效数字定义的。123456789123456789.0的精度不高于或低于0.123456789123456789。

在编程中处理财务值时经常出现一个问题:

浮点值不能很好地转换为十进制分数

许多开发人员倾向于将浮点值视为十进制分数,因为在将它们转换为字符串时,它们主要由十进制分数表示,反之亦然。事实并非如此。正如所述,浮点值的小数部分存储为二进制分数

这使得浮点值(及其计算)稍微偏离其十进制表示形式

解决此问题的一种方法是(如您所述)使用数据类型
decimal
,该类型用于进行必须直接转换为小数点的计算(如金融计算)

另一种方法是在显示或存储浮点计算结果之前,对所有结果进行四舍五入。对于金融计算,应使用:

Math.Round([your value here], 2, MidpointRounding.AwayFromZero);
我建议尽可能选择前者。在进行计算时,它省去了许多麻烦。使用舍入方法,必须在许多点上考虑舍入误差。将现有项目转换为十进制可能是一项艰巨的任务,但从长远来看,它很可能会得到回报(如果可能的话,首先

关于您的编辑:

出现此问题的原因是,如果在求和之前对进行四舍五入,则舍入误差会累积。您可以选择在对未舍入的值求和之后对进行四舍五入。在这方面,使用双精度还是十进制都是有利的,因为这两种方法都适用

这是否允许,取决于您进行的财务计算类型。
如果总和以打印形式出现在例如发票上,则极有可能不允许这样做

什么不起作用?请举例说明。有大量的2位小数不能用双精度字体精确表示,因此无论你做什么,都会出现不准确的情况。你能详细说明你所遇到的错误吗?请原谅se至少发布您的错误类型和消息,以便我们帮助您…程序流程是这样的:值被四舍五入到小数点后2位(因为这是它们存储在数据库中的方式)只有那些保存的值才会被检索和求和。所以我想我们显然会面临这个错误。舍入在任何时候都不会有任何帮助。舍入最终还是会有一些帮助。如果您的DB代码目前只是将数字设置为小数点后2位,这甚至会加剧前面提到的舍入错误累积。取消舍入(最终使用中点舍入。远离零,以保持财务稳健)将在一定程度上缓解问题…数据库不存储截断的值,而是“四舍五入到2位”的值。实际上,它们的第一次求和是小数点后4位,下一步求和是使用数据库的检索值,即小数点后2位的值。因此,在比较两者时,存在偏差,例如,0.03到0.05。你认为解决方法是什么?没有其他方法可以通过修改DB(让它存储更多的小数位数)或值(在存储前乘以例如1000,然后在加载后再除以)来防止精度损失。因为:如果失去精度,就失去精度。没有办法获得它。”神奇地“回来”,所以不要失去它,除非你准备好承受后果。