我正在学习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
我的问题是:
我可以更精确吗?
答案 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对你来说是一个足够小的差异,它应该是日常使用的。)