0

Can anyone explain this?

Decimal leftSide = 13.0M;
Decimal rightSide = 1.0M;
Decimal tmpDec = 39.0M;

tmpDec * (rightSide / leftSide) = 2.9999999999999999999999999991

tmpDec * rightSide / leftSide = 3

Am I losing significant digits on the first's (rightSide / leftSide)?

4

3 回答 3

3

Decimal 类型仅精确到 29 位有效数字。

2.9999999999999999999999999991

^ 有超过 29 位有效数字。

如果您需要更高的精度,您可以使用System.Numerics.BigInteger(将其修改为定点小数)。

于 2013-04-10T12:37:25.667 回答
2

这是四舍五入(失去精度)的问题。

第一种情况首先执行除法并裁剪最后一位数字(小数点后第 28 位之后,因为浮点数(或双精度或小数或任何其他固定精度数据类型)无法存储无限长值),然后执行裁剪值的乘法,增加了3900万倍的损失。这已经变得很重要(现在不是第 28 位问题,坚果 20-22)并且不能四舍五入到 3.0。

第二种情况首先执行不丢失精度的乘法并存储每 8 位,然后执行精度较低的除法(小数点后 6 位)。所以四舍五入已经四舍五入到 3.0 而不是 2.999999999999999999999 就像第一种情况一样。

于 2013-04-10T12:32:33.460 回答
-1

将无限多个实数压缩为有限位数需要近似表示。尽管整数有无限多,但在大多数程序中,整数计算的结果可以存储在 32 位中。相反,给定任何固定位数,大多数实数计算将产生无法使用那么多位精确表示的量。因此,浮点计算的结果必须经常四舍五入以适应其有限表示。这种舍入误差是浮点计算的特征

于 2013-04-10T12:37:31.003 回答