6

在午休时间,我们开始讨论double值类型的精度。

我的同事认为,它总是有小数点后 15 位。

在我看来,不能说,因为 IEEE 754 没有对此做出假设,这取决于第一个1在二进制表示中的位置。(即小数点前的数字大小也计算在内)

怎样才能做出更合格的陈述?

4

4 回答 4

3

正如C# 参考中所述,精度在小数点之前或之后为 15 到 16 位(取决于所表示的十进制值)。

简而言之,你是对的,它取决于小数点前后的值

例如:

  • 12345678.1234567D//右边的下一个数字将被四舍五入
  • 1234567.12345678D//右边的下一个数字将被四舍五入

完整示例:http: //ideone.com/eXvz3

此外,尝试将double值视为固定十进制值也不是一个好主意。

于 2012-08-23T10:48:35.750 回答
3

你们都错了。法线double具有 53精度。这大致相当于 16 位小数,但将double值视为小数会导致混乱,最好避免。

也就是说,您比您的同事更接近正确——精度与所表示的值相关;足够大double的 s没有小数位精度。

例如,下一个大于4503599627370496.0is的 double 4503599627370497.0

于 2012-08-23T11:09:21.563 回答
0

C# 双精度数根据 IEEE 754 用 53 位有效数 p(或尾数)和 11 位指数e表示,范围在 -1022 和 1023 之间。因此,它们的值是

p * 2^e

有效数字在小数点前总是有一位,因此其小数部分的精度是固定的。另一方面,双精度数中小数点后的位数也取决于其指数;指数超过有效数字小数部分的位数的数字本身没有小数部分。

What Every Computer Scientist Should Know About Floating-Point Arithmetic可能是该主题最广为人知的出版物。

于 2012-08-23T10:57:20.860 回答
0

由于这是我在该主题上可以找到的唯一关于 SO 的问题,因此我想对jorgebg 的回答进行补充。

据此精度实际上是 15-17 位。具有 17 位精度的双精度示例是 0.92107099070578813(不要问我是如何得到这个数字的:P)

于 2019-10-04T15:50:09.283 回答