在午休时间,我们开始讨论double
值类型的精度。
我的同事认为,它总是有小数点后 15 位。
在我看来,不能说,因为 IEEE 754 没有对此做出假设,这取决于第一个1
在二进制表示中的位置。(即小数点前的数字大小也计算在内)
怎样才能做出更合格的陈述?
正如C# 参考中所述,精度在小数点之前或之后为 15 到 16 位(取决于所表示的十进制值)。
简而言之,你是对的,它取决于小数点前后的值。
例如:
12345678.1234567D
//右边的下一个数字将被四舍五入1234567.12345678D
//右边的下一个数字将被四舍五入完整示例:http: //ideone.com/eXvz3
此外,尝试将double
值视为固定十进制值也不是一个好主意。
你们都错了。法线double
具有 53位精度。这大致相当于 16 位小数,但将double
值视为小数会导致混乱,最好避免。
也就是说,您比您的同事更接近正确——精度与所表示的值相关;足够大double
的 s没有小数位精度。
例如,下一个大于4503599627370496.0
is的 double 4503599627370497.0
。
C# 双精度数根据 IEEE 754 用 53 位有效数 p(或尾数)和 11 位指数e表示,范围在 -1022 和 1023 之间。因此,它们的值是
p * 2^e
有效数字在小数点前总是有一位,因此其小数部分的精度是固定的。另一方面,双精度数中小数点后的位数也取决于其指数;指数超过有效数字小数部分的位数的数字本身没有小数部分。
What Every Computer Scientist Should Know About Floating-Point Arithmetic可能是该主题最广为人知的出版物。
由于这是我在该主题上可以找到的唯一关于 SO 的问题,因此我想对jorgebg 的回答进行补充。
据此,精度实际上是 15-17 位。具有 17 位精度的双精度示例是 0.92107099070578813(不要问我是如何得到这个数字的:P)