双数据类型不能正确表示一些底座10倍的值。 这是因为浮点数如何表示实数。 这意味着,代表货币价值时,应该使用十进制值类型,以防止错误。 (随时纠正这个错误序言)
我想知道的是什么,其在标准Net框架64位架构下呈现双数据类型下这样的问题的值(C如果使#差别)?
我想到的答案是一个公式或规则来找到这样的价值观,但我也想了一些示例值。
双数据类型不能正确表示一些底座10倍的值。 这是因为浮点数如何表示实数。 这意味着,代表货币价值时,应该使用十进制值类型,以防止错误。 (随时纠正这个错误序言)
我想知道的是什么,其在标准Net框架64位架构下呈现双数据类型下这样的问题的值(C如果使#差别)?
我想到的答案是一个公式或规则来找到这样的价值观,但我也想了一些示例值。
不能被写为2正的和负的功率和任何数量不能被精确表示为二进制浮点数。
公共IEEE格式浮点数的32位和64位表示施加进一步的限制; 它们限制在尾数和指数二进制位数。 因此,有最大和最小可表示数(约+/- 10 ^ 308(基-10)如果没有记错)和限制到可以表示的数的精度。 在精密此限制意味着,64位数字,2的最大功率,并在一些最小功率的指数之间的差异限制在52,如果你的号码包括2 ^ 52的一个术语它可以“T还包括在2 ^ -1的术语。
不能在二进制浮点数精确表示数字的简单的例子包括1/3
, 2/3
, 1/5
。
由于集浮点数的(在任何表示)是有限的,并且实数集是无限的,一种算法找到的实数是不完全表示为一个浮点数是选择在一个实数随机。 该实数是一个浮点数精确表示的概率为0
。
这个问题实际上超出任何单一的编程语言或平台。 这种不准确性是二进制数据实际上固有的。
考虑带有双,小数点的每个数N到左侧(在0为基础的指数I)表示的值N * 2 ^ I和每个数字在小数点的右边表示的值N * 2 ^( -一世)。
作为一个例子,5.625(底为10)将101.101(基数为2)。
鉴于这种计算,并且十进制值不能为2 ^的总和来计算( - I)为的予不同的值将有一个不正确的值作为双。
通常,您需要为您的存储任何的可能性做好准备double
有错误的一些小数额。 除非你存储一个恒定值,没准它可能是一些具有至少有一些错误。 如果它的当务之急是再也不会有任何错误,并且值不是恒定的,你可能不应该使用浮点类型。
你或许应该问在很多情况下,“我如何处理未成年人的浮点错误?” 你会想知道可能会导致大量的错误是什么类型的操作,以及什么类型的没有。 你要确保对“平等”比较两个值实际上只是保证它们是“足够接近”,而不是完全相等,等等。
浮子被表示为s
, e
和m
以下公式
s * m * 2^e
这意味着不能使用给定的表达式来表示任何数量的(在各自的结构域s
, e
和m
)不能被精确表示。
基本上,可以代表之间的所有的数字0
和2^53 - 1
乘以2特定功率(可能是负电源)。
作为一个例子,之间的所有数字0
和2^53 - 1
可以被表示乘以2^0 = 1
。 而且你还可以通过将它们除以代表所有这些数字2
(以.5
分)。 等等。
这个答案没有完全覆盖的话题,但我希望它能帮助。