在午休时,我们开始辩论关于double值类型的精度问题。
我的同事认为它总是有15个小数点后面的位数。
在我看来,这是无法确定的,因为IEEE 754并不作出假设,这取决于二进制表示中第一个1的位置。(即小数点前数字的大小也很重要)
如何才能作出更有资格的陈述呢?
我的同事认为它总是有15个小数点后面的位数。
在我看来,这是无法确定的,因为IEEE 754并不作出假设,这取决于二进制表示中第一个1的位置。(即小数点前数字的大小也很重要)
如何才能作出更有资格的陈述呢?
double
值视为固定的十进制值并不是一个好主意。你们两个都错了。一个常规的double
有53个位数的精度。这大约相当于16个小数位,但把double
值看作十进制数会导致很多混淆,最好避免。
话虽如此,你比你的同事接近正确——精度是相对于所表示的值而言的;足够大的double
没有任何小数位的精度。
例如,比4503599627370496.0
稍大的下一个double
是4503599627370497.0
。
C# 中的 double 类型使用 IEEE 754 标准进行表示,其中包含一个 53 位有效数字 p(又称尾数)和一个 11 位指数 e,其范围在 -1022 到 1023 之间。因此,它们的取值范围为
p * 2^e
尾数总是在小数点前有一位数字,因此其小数部分的精度固定。另一方面,在浮点数中小数点后的数字取决于指数;指数超过尾数小数部分的位数的数字本身就没有小数部分。
计算机科学家应该了解的浮点运算知识可能是这个主题上最广为人知的出版物。
由于这是我在SO上能找到唯一关于该主题的问题,因此我想对jorgebg's answer进行补充。
根据这个, 精度实际上是15-17位数字。一个具有17位精度的double示例将是0.92107099070578813(别问我怎么得到这个数字:P)