-4

我正在学习 TDD,并决定创建一个 Calculator 类来开始。我先做了基本的,现在我在平方根函数上。

我正在使用这种方法来获取根http://www.math.com/school/subject1/lessons/S1U1L9DP.html 我用很少的数字对其进行了测试,而且我总是得到准确的答案。很容易理解。

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

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

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

当我做:

18 / 4.25

我目前得到:4.2352941176470588235294117647

什么时候应该:( 4.2352941176470588235294117647059使用 Windows 计算器)

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

4.2426406871192851464050688705 ^ 2 = 18.000000000000000000000022892

我的问题是:

我可以更准确吗?

4

2 回答 2

6

4.2352941176470588235294117647包含 29 位数字。

decimal定义为具有 28-29 位有效数字。您无法将更准确的数字存储在decimal.

您在哪个工程或科学领域工作,第 30 位或更多位对整体计算的准确性很重要?

(如果您显示更多实际代码,它也可能会有所帮助。您显示的唯一代码是18 / 4.25,它不能是代码中的实际表达式,因为第二个数字是double文字,您可以'不要将此表达式的结果分配给decimal没有强制转换的a)。


如果您需要任意精度,则没有标准的“BigRational”类型,但有一个BigInteger. 如果需要,可以使用它来构造BigRational类型(将分子和分母存储为两个单独的整数)。为什么还没有标准类型的一种猜测是,关于何时规范化这些有理数的决定可能会影响性能或相等比较。

于 2012-09-29T15:31:32.423 回答
3

浮点计算不准确。小数可以提高精度,因为它们是 128 位长,但它们仍然是浮点数。

比较两个浮点数不是用 来完成的==,而是:

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

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

于 2012-09-29T15:19:02.433 回答