C# 如果双数可以';你不能持有那么多重要的数字吗?

C# 如果双数可以';你不能持有那么多重要的数字吗?,c#,clr,primitive-types,C#,Clr,Primitive Types,我很可能对重要人物没有正确的理解,但这本书 简言之,约瑟夫·阿尔巴哈里和本·阿尔巴哈里(O'Reilly)的C#6.0 2016年约瑟夫·阿尔巴哈里和本·阿尔巴哈里版权所有,978-1-491-92706-9 提供下表,用于比较双精度和十进制: 一方面,一个double可以保存较少的有效数字,而另一方面,它可以表示比decimal大得多的数字,而decimal可以保存较多的有效数字,这不是违反直觉的吗?范围与精度无关。Double有一个二进制表示(以2为基数)。并不是所有的数字都能像我们人类所

我很可能对重要人物没有正确的理解,但这本书

简言之,约瑟夫·阿尔巴哈里和本·阿尔巴哈里(O'Reilly)的C#6.0

2016年约瑟夫·阿尔巴哈里和本·阿尔巴哈里版权所有,978-1-491-92706-9

提供下表,用于比较双精度和十进制:


一方面,一个double可以保存较少的有效数字,而另一方面,它可以表示比decimal大得多的数字,而decimal可以保存较多的有效数字,这不是违反直觉的吗?

范围与精度无关。Double有一个二进制表示(以2为基数)。并不是所有的数字都能像我们人类所知道的那样精确地用十进制格式表示。更不用说累加和除法的舍入误差了。范围越大,表示最大值越大,最小值越小


另一侧的小数是(以10为基数)。其范围较小(最大值较小,最小值较大)。这与精度无关,因为它不是用浮点二进制表示法来表示的,它可以更精确地表示数字,尽管建议用于人工数字和计算。

范围与精度无关。Double有一个二进制表示(以2为基数)。并不是所有的数字都能像我们人类所知道的那样精确地用十进制格式表示。更不用说累加和除法的舍入误差了。范围越大,表示最大值越大,最小值越小


另一侧的小数是(以10为基数)。其范围较小(最大值较小,最小值较大)。这与精度无关,因为它不是用浮点二进制表示法来表示的,它可以更精确地表示数字,尽管建议用于人造数字和计算。

答案在于双精度的编码方式。它们不仅仅是一个数字的直接二进制表示,而是由三部分组成:符号、指数和分数

  • 符号很明显,它控制+或-

  • 分数部分也很明显。它是二进制分数,表示一个介于0和1之间的数字

  • 指数就是魔法发生的地方。它表示一个比例因子

最后的浮点计算结果为(-1)^$符号*(1+$分数)*2^$指数


由于指数的原因,这允许比直接十进制数字更高的值。有很多关于为什么这样做,以及如何用这些编码的数字进行加法和乘法的阅读。谷歌搜索“IEEE浮点格式”或任何你需要的主题。希望有帮助

答案在于双精度编码的方式。它们不仅仅是一个数字的直接二进制表示,而是由三部分组成:符号、指数和分数

  • 符号很明显,它控制+或-

  • 分数部分也很明显。它是二进制分数,表示一个介于0和1之间的数字

  • 指数就是魔法发生的地方。它表示一个比例因子

最后的浮点计算结果为(-1)^$符号*(1+$分数)*2^$指数


由于指数的原因,这允许比直接十进制数字更高的值。有很多关于为什么这样做,以及如何用这些编码的数字进行加法和乘法的阅读。谷歌搜索“IEEE浮点格式”或任何你需要的主题。希望有帮助

想象一下,有人告诉你可以存储一个值,但给了你一个限制:你只能存储10位数字,0-9和一个负号。您可以创建规则来解码值,以便存储任何值

存储东西的第一种方式就是将值
xxxxxxxxx
,这意味着数字123存储为
0000000123
。易于存储和阅读。这就是
int
的工作原理

现在,您决定要存储小数,所以需要稍微更改一下规则。现在存储
xxxxxx-yyy
,其中
x
是整数部分,
y
是小数部分。因此,123.98将存储为
0001239800
。这大致就是
十进制
值的工作原理。您可以看到我可以存储的最大值是
99999999
,它转换为9999999.9999。这意味着我对值的大小有一个严格的上限,但有效数字的数量很大,为10


有一种方法可以存储较大的值,那就是在
xxxxxx-yyy
中存储公式的x和y分量。所以,要存储123.98,您需要存储
01239800-2
,我可以将其计算为。这意味着我可以通过更改“y”来存储更大的数字,但有效位数基本上固定为6。这基本上就是双精度编码的工作原理。

想象一下,有人告诉你可以存储一个值,但给了你一个限制:你只能存储10位数字,0-9和一个负号。您可以创建规则来解码值,以便存储任何值

存储东西的第一种方式就是将值
xxxxxxxxx
,这意味着数字123存储为
0000000123
。易于存储和阅读。这就是
int
的工作原理

现在,您决定要存储小数,所以需要稍微更改一下规则。现在存储
xxxxxx-yyy
,其中
x
是整数部分,
y
是小数部分。因此,123.98将存储为
0001239800
。这大致就是
十进制
值的工作原理。你可以看到我能存储的最大值是
99