我很可能对重要的数字没有正确的理解,但这本书
C# 6.0概括地说,约瑟夫阿尔巴哈里和本阿尔巴哈里(O‘’Reilly)。 版权所有2016年约瑟夫阿尔巴哈里和本阿尔巴哈里,978-1-491-92706-9。
提供下表,用于比较double和decimal

一方面,一个双可以容纳较小数量的重要数字,另一方面它可以代表比十进制大得多的数字,这难道不是违反直觉的吗?
发布于 2016-07-17 17:15:07
假设有人告诉您可以存储一个值,但是它给了您一个限制:您只能存储10位数字、0-9和一个负符号。您可以创建用于解码值的规则,以便存储任何值。
存储事物的第一种方式是简单地作为值xxxxxxxxxx存储,这意味着数字123被存储为0000000123。易于存储和阅读。这就是int的工作方式。
现在您决定要存储小数,所以您可以稍微修改一下规则。现在存储xxxxxxyyyy,其中x是整数部分,y是小数部分。因此,123.98将作为0001239800存储。这大致就是Decimal值的工作方式。您可以看到,我可以存储的最大值是9999999999,它的转换值为999999.9999。这意味着我对值的大小有一个严格的上限,但重要数字的数目在10时很大。
有一种存储较大值的方法,即存储公式的x和y分量
在xxxxxxyyyy中。因此,要存储123.98,需要存储01239800-2,我可以将其计算为
。这意味着我可以通过改变'y‘来存储更大的数字,但是有效数字的数量基本上固定在6,这就是double的工作原理。
发布于 2016-07-17 16:59:31
答案在于双倍编码的方式。它们不仅仅是一个数字的直接二进制表示,它们有三个部分:符号、指数和分数。
最后的浮点数计算为(-1)^$符号* (1 + $fraction) *2^$指数
由于指数的关系,这使得数值比一个直接的十进制数高得多。这里有很多关于为什么工作,以及如何用这些编码的数字进行加法和乘法的读物。谷歌周围的"IEEE浮点格式“或任何主题,你需要。希望这能帮上忙!
发布于 2016-07-17 16:55:33
距离与精确度无关。Double有一个二进制表示(基数2)。并不是所有的数字都可以像我们人类所知道的那样以十进制格式精确地表示出来。更不用说加法和除法的舍入误差了。更大的范围意味着比十进制更大的最大值和更小的最小值。
另一边的小数点是(基数10)。它有一个较小的范围(较小的最大值和较大的最小值)。这与精度无关,因为它不是用浮点表示来表示的,它可以更精确地表示数字,尽管推荐用于人工生成的数字和计算。
https://stackoverflow.com/questions/38423530
复制相似问题