c#减法即使是小数也不准确?

时间:2012-09-29 15:16:19

标签: c# math

我正在学习TDD,并决定创建一个Calculator类来开始。 我先做了基本的,现在我正在使用Square Root功能。

我正在使用此方法获取根http://www.math.com/school/subject1/lessons/S1U1L9DP.html 我用很少的数字测试它,我总能得到准确的答案。 很容易理解。

现在我遇到了一个奇怪的问题,因为有了一些数字,我得到了正确的答案,有些人,我没有。

我调试了代码,发现当我使用减法时,我得不到正确的答案。

我正在使用小数来获得最准确的结果。

当我这样做时:

18 / 4.25

我目前正在:4.2352941176470588235294117647

应该是:4.2352941176470588235294117647059(使用Windows计算器)

在路的尽头,这是我最接近18的根:

4.2426406871192851464050688705 ^ 2 = 18.000000000000000000000022892

我的问题是:

我可以更精确吗?

2 个答案:

答案 0 :(得分:6)

4.2352941176470588235294117647包含29位数字。

decimal定义为28-29个有效数字。您无法在decimal中存储更准确的数字。

您在哪个工程或科学领域工作,其中第30位以上的数字对整体计算的准确度有重要意义?

(如果您展示了更多实际代码,也可能会有所帮助。您展示的唯一代码是18 / 4.25,它不能是您代码中的实际表达式,因为第二个number是double字面值,如果没有强制转换,则无法将此表达式的结果分配给decimal


如果你需要任意精度,那么就没有标准的“BigRational”类型,但有一个BigInteger。如果需要,可以使用它来构造BigRational类型(将分子和分母存储为两个单独的整数)。对于没有标准类型的原因的一个猜测是何时对...规范化这些理性可能会影响绩效或平等比较。

答案 1 :(得分:3)

浮点计算不准确。小数使得精度更好,因为它们是128位长,但它们仍然是浮点数。

比较两个浮点数不是使用==,而是:

static bool SameDecimal(decimal a, decimal b)
{
    return Math.Abs(a-b) < 1e-10;
}

这种方法可以让你比较两个小数(我假设1e-10对你来说是一个足够小的差异,它应该是日常使用的。)