如果双数不能包含那么多有效数字,那么双数如何表示高于小数的数字?

时间:2016-07-17 16:41:16

标签: c# clr primitive-types

我很可能没有正确理解重要数字,但这本书

  约瑟夫·阿尔巴哈里和本·阿尔巴哈里(奥莱利)在果壳中的C#6.0。

     

版权所有2016 Joseph Albahari和Ben Albahari,978-1-491-92706-9。

提供了下表,用于比较doubledecimal

enter image description here

一方面,双倍可以容纳较小数量的有效数字,而另一方面它可以表示比小数更大的数字,这可能是非反直觉的更高数量的重要数字

3 个答案:

答案 0 :(得分:2)

想象一下,你被告知你可以存储一个值,但是有一个限制:你只能存储10位,0-9和一个负号。您可以创建规则来解码值,这样您就可以存储任何值。

存储内容的第一种方式只是值xxxxxxxxxx,这意味着数字123存储为0000000123。易于存储和阅读。这就是int的工作方式。

现在您决定要存储小数,以便稍微更改规则。现在存储xxxxxxyyyy,其中x是整数部分,y是小数部分。因此,123.98将存储为0001239800。这大致是Decimal值的工作原理。您可以看到我可以存储的最大值是9999999999,转换为999999.9999。这意味着我对值的大小有一个硬上限,但有效数字的数量很大,为10。

有一种方法可以存储更大的值,那就是在xxxxxxyyyy中存储公式x*10^y的x和y分量。因此,要存储123.98,您需要存储01239800-2,我可以将其计算为12398*10^-2。这意味着我可以通过更改'y'来存储更大的数字,但有效数字的数量基本上固定为6.这基本上是double的工作方式。

答案 1 :(得分:1)

答案在于双打编码的方式。它们不仅仅是数字的直接二进制表示,而是有3个部分:符号,指数和分数。

  • 标志很明显,它控制着+或 - 。

  • 分数部分也很明显。它的二进制分数表示0到1之间的数字。

  • 指数是神奇发生的地方。它表示缩放因子。

最终浮动计算结果为(-1)^ $ sign *(1 + $ fraction)* 2 ^ $ exponent

由于指数,这允许比直线十进制数高得多的值。有很多关于它为何起作用以及如何使用这些编码数字进行加法和乘法的阅读。谷歌围绕" IEEE浮点格式"或者你需要的任何话题。希望有所帮助!

答案 2 :(得分:0)

范围与精度无关。 Double具有二进制表示(基数2)。并非所有数字都可以完全表示,因为我们人类以十进制格式知道它们。更不用说和累加的加法和除法的舍入误差。范围越大意味着MAX值越大,MIN值越小。

另一边的十进制是(基数10)。它的范围较小(MAX VALUE较小,MIN VALUE较大)。这与精度无关,因为它不使用浮动二进制点表示表示,它可以更精确地表示数字,但建议用于人工数字和计算。