如何处理大多数小数部分无法用二进制精确表示的事实?

因此,我们知道诸如0.1之类的分数无法在二进制基数中准确表示,这会导致精确的问题(例如此处提到的: 格式化C#中输出的双精度数 )。

我们知道数字的十进制表示有十进制类型…但问题是,很多数学方法,不支持十进制类型,所以我们将它们转换为double,这再次破坏了数字。

那我们该怎么办?

要全面了解执行浮点计算所涉及的挑战,请参阅以下文章:

每个计算机科学家应该知道的关于浮点运算的内容 http://docs.sun.com/source/806-3568/ncg_goldberg.html

哦,对于大多数小数部分不能用二进制表示的事实我们该怎么办? 或者就此而言,二进制分数不能用十进制表示?

或者,甚至,在任何计算机化系统中都无法准确表示所有基数中的无穷大(实际上是不可数无穷大)的实数?

没有! 回想一下陈旧的陈词滥调,你可以近距离接触政府的工作……事实上,你可以接近任何工作……计算机可以产生的准确度没有限制,它不能无限,(这是数字表示方案能够代表每个可能的实数所需的)

您可以看到,对于您可以设计的每个数字表示方案,在任何计算机中,它只能表示有限数量的不同的不同实数,准确度为100.00%。 在每个相邻的那对数字之间(那些可以100%准确度表示的数字),总会有无穷无尽的其他数字,它不能100%准确地表示。

那我们该怎么办?

我们只是继续呼吸。 这真的不是一个结构性问题。 我们的精度有限,但通常绰绰有余。 您只需记住在显示数字时格式化/舍入。

以下代码段中的问题是WriteLine() ,而不是计算中的问题:

 double x = 6.9 - 10 * 0.69; Console.WriteLine("x = {0}", x); 

如果您有特定问题,请发布。 通常有办法防止精度损失。 如果你真的需要> = 30十进制数字,你需要一个特殊的库。

请记住,您需要的精度以及所需的舍入规则将取决于您的问题域。

如果你正在编写控制核反应堆的软件,或者在大爆炸之后模拟宇宙中第一个十亿分之一秒(我的朋友真的这样做了),你需要比计算销售税时更高的精确度(某些东西)我这样做是为了谋生。

例如,在金融领域,隐式或明确地对精度有特定要求。 一些美国税务司法管辖区将税率指定为小数点后的5位数。 您的舍入方案需要允许那么高的精度。 当西欧大部分地区转变为欧元时,有一种非常具体的四舍五入方法被写入法律。 在过渡期间,必须完全按要求进行整理。

了解您的域的规则,并测试您的舍入方案是否满足这些规则。

我想每个人都暗示: 反转稀疏矩阵? “有一个应用程序,”等等

数值计算是一匹训练有素的马。 如果你遇到问题,它可能会在1970年之前或更早的时候放到牧场,通过图书馆或片段将片段推进到未来。

您可以移动小数点以使数字为整数,然后进行64位整数运算,然后将其移回。 那你只需要担心溢出问题。

我们知道数字的十进制表示有十进制类型…但问题是,很多数学方法,不支持十进制类型,所以我们将它们转换为double,这再次破坏了数字。

有几种数学方法支持decimalAbsCeilingFloorMaxMinRoundSignTruncate 。 这些function的共同之处在于它们返回了确切的结果。 这与decimal的目的一致:用基数为10的数字进行精确算术运算。

trig和Exp / Log / Pow函数返回近似答案,那么对于“精确”算术类型具有重载的重点是什么?