C# 如何处理大多数小数不能用二进制准确表示的事实?

C# 如何处理大多数小数不能用二进制准确表示的事实?,c#,floating-point,double,decimal,C#,Floating Point,Double,Decimal,所以,我们知道分数,比如0.1,不能用二进制基数精确表示,这会导致精确的问题(比如这里提到的:) 我们知道数字的十进制表示有十进制类型。。。但问题是,许多数学方法不支持十进制类型,因此我们必须将它们转换为double,这再次破坏了数字 那么我们应该怎么做呢?要全面了解执行浮点计算所面临的挑战,请参阅本文: 每一位计算机科学家都应该知道的浮点运算 您可以移动小数点,使数字为整数,然后执行64位整数运算,然后将其移回原位。那么您只需担心溢出问题 那我们该怎么办呢 我们只是继续呼吸。这真的不是一个结构

所以,我们知道分数,比如0.1,不能用二进制基数精确表示,这会导致精确的问题(比如这里提到的:)

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


那么我们应该怎么做呢?

要全面了解执行浮点计算所面临的挑战,请参阅本文:

每一位计算机科学家都应该知道的浮点运算

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

那我们该怎么办呢

我们只是继续呼吸。这真的不是一个结构性问题。我们的精度有限,但通常已经足够了。在展示数字时,你只需记住格式化/四舍五入即可

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


如果你有特殊的问题,就把它贴出来。通常有一些方法可以防止精度损失。如果你真的需要>=30个十进制数字,你需要一个特殊的库。

哦,对于大多数十进制分数不能用二进制表示这一事实,我们该怎么办?或者说,二进制分数不能用十进制表示

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

没什么!回想一句老生常谈,你可以离政府工作足够近。。。事实上,你可以接近任何工作。。。计算机能产生的准确度没有限制,只是不能是无限的(这是数字表示方案能够表示每一个可能的实数所需要的)


你看,对于你能设计的每一个数字表示方案,在任何一台计算机上,它只能以100.00%的精度表示一个有限的个不同的实数。在这些数字的每一对相邻的数字之间(那些可以100%准确地表示的数字),总会有无限多的其他数字无法100%准确地表示

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

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

例如,在金融界,无论是隐式的还是显式的,对精确度都有具体的要求。一些美国税收管辖区规定税率为小数点后5位。您的舍入方案需要考虑到这么高的精度。当西欧大部分地区转换为欧元时,有一种非常具体的四舍五入方法被写入了法律。在这一过渡时期,必须严格按照要求进行轮换


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

我认为每个人都在暗示: 求稀疏矩阵的逆?“这有一个应用程序”,等等

数值计算是一匹被鞭打得很好的马。如果你有一个问题,它可能在1970年之前或者更早的时候就被放在牧场上,一个库一个库地向前推进,或者一段一段地向前推进到未来

我们知道我们有十进制类型 对于的十进制表示形式 数字。。。但问题是,很多 数学方法,不支持 十进制类型,所以我们必须转换它们 翻倍,这会破坏数字 再说一遍

有几种确实支持十进制:
Abs
天花板
地板
最大
最小
圆形
符号
,以及
截断
。这些函数的共同点是它们返回精确的结果。这与十进制的目的是一致的:用以10为基数的数字进行精确运算


trig和
Exp
/
Log
/
Pow
函数返回近似答案,那么对于“精确”算术类型使用重载有什么意义呢?

您确定这足够具体吗?请记住,分数只有在使用固定长度的浮点格式时才是不精确的。没有什么能阻止你将任意精确的分数表示为两个数字的真实比率,除了你必须手动完成所有的数学运算。你所指的运算类型是什么,小数不可用?你能详细说明一下吗?有可数的无穷大吗?是的,有理数的数目(分数,或者从技术上讲,那些可以表示为两个整数的比率的数)是可数的。。。证明方法是将所有整数列为表中的行标题和列标题,每个单元格都包含一个分数,即列值除以行值。然后从左上角单元格(1/1)开始按对角线(从左下到右上方向)进行“计数”,然后第二个对角线是1/2、2/1,然后第三个对角线是1/3、2/2、3/1,等等。。这个过程有效地“计算”了有理数…康托提出了这个(我认为是在19世纪),他称之为无穷大的第一级aleph null或aleph zero。实数(理性和非理性,如sqrt(2))的数量是aleph=1,并且是不可数的。他证明了无穷多个层次的无穷大,尽管这超出了我用通俗易懂的语言来解释的能力
double x = 6.9 - 10 * 0.69;
Console.WriteLine("x = {0}", x);