2009-10-17 210 views
7

已知在.NET中,long和double的大小都是8个字节。但是,double可以存储比long更大的数字。考虑到double还需要存储小数点后的数字数据,怎么会这样呢?问题的.NET中long和double的最大值与大小的关系

较短的版本:

Math.Pow(2,64)== long.MaxValue Math.Pow(2,64)< double.MaxValue

+0

double的精度小于小数。 – 2009-10-17 16:10:00

+0

http://en.wikipedia.org/wiki/Double_precision – 2009-10-17 16:13:09

+0

http://en.wikipedia.org/wiki/Floating_point#Range_of_floating-point_numbers – 2009-10-17 16:29:01

回答

17

短的答案双仅存储最重要的数字,而不是数字中的所有数字。例如如果您有长整数的double> max值,它将不会存储小数点后的数字或小数点左侧的任何数字。

对于所有的详情,请参阅What every computer scientist should know about Floating-Point Arithmetic

+1

用足够简单的术语来解释任何人的理解:) – Konstantin 2009-10-17 16:40:19

+0

我最初使用这段文字大约一年前,发现它真的很有帮助。 – LJM 2009-10-17 17:24:32

0

双是浮点数字。如同二重奏存储的数字变得越来越大,它变得越来越粗糙,最不重要的部分被驳回。

例如,当你有一个像1000亿这样的数字时,就是两倍。 它可能正好是100亿000或它可能是100 000 000 000 000 000 000 000 001

+0

虽然这没有错,但它没有提到double为什么会比int或long更大的主要原因,即它是由有效数和指数表示的浮点数。 – 2009-10-17 16:38:06

1

基于整数的类型的整数范围从-2 ^(n-1)2 ... 2 ^(n -1)-1(带符号), 或0 ... 2^n-1(无符号)。

固定点变量与基于整数的类型相同,仅具有常数因子(例如,对于0.01:0.01 *(0 ... 2^n-1))。

任何语言的浮点变量(浮点型和双精度型)都使用指数的几位,其余指数用于指数前的数字。它们不太准确(x + 1可能等于x,x是一个非常大的数字),但具有更大的范围。

+1

顺便说一句,“指数前的数字”被称为尾数或(更好)有效数字,请参阅http://en.wikipedia.org/wiki/Significand。 – 2009-10-17 16:36:05