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

sam*_*amy -4 c# math

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

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

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

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

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

当我做:

18 / 4.25
Run Code Online (Sandbox Code Playgroud)

我目前正在: 4.2352941176470588235294117647

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

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

4.2426406871192851464050688705 ^ 2 = 18.000000000000000000000022892
Run Code Online (Sandbox Code Playgroud)

我的问题是:

我可以更精确吗?

Dam*_*ver 6

4.2352941176470588235294117647 包含29位数字.

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

您在哪个工程领域或科学领域工作,其中第30位和更多位数对整体计算的准确性有重要影响?

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


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