当大小相同时浮点数和整数数据类型有什么区别?
答案 0 :(得分:81)
float
存储浮点值,即具有潜在小数位的值int
仅存储整数值,即整数因此,虽然两者都是32位宽,但它们的使用(和表示)却完全不同。您不能将3.141存储为整数,但可以使用float
。
将它们进一步解剖:
在整数中,所有位用于存储数值。这是(在Java和许多计算机中)在所谓的二补码中完成的。这基本上意味着您可以将-2 31 的值表示为2 31 - 1。
在浮点数中,这32位在三个不同的部分之间划分:符号位,指数和尾数。它们的布局如下:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
有一个位确定数字是负数还是非负数(零既不是正数也不是负数,但是符号位设置为零)。然后有八位指数和23位尾数。为了从中获得有用的数字,(大致)执行以下计算:
M ×2 E
(还有更多内容,但这足以满足本次讨论的目的)
尾数本质上不会超过24位整数。它乘以指数部分的幂乘以2,大致是-128到127之间的数字。
因此,您可以准确地表示适合24位整数的所有数字,但数值范围也要大得多,因为较大的指数允许更大的值。例如,float
的最大值约为3.4×10 38 ,而int
仅允许值高达2.1×10 9 。 / p>
但这也意味着,因为32位只有4.2×10 9 不同的状态(它们都用来表示int
可以存储的值),在更大的一端float
的数字范围,数字间隔较宽(因为没有比唯一float
数字更多的唯一int
数字。那么你不能完全代表一些数字。例如,数字2×10 12 在float
中的表示为1,999,999,991,808。这可能关闭到2,000,000,000,000,但这并不准确。同样地,将1添加到该数字不会改变它,因为1太小而无法在较大的比例中float
使用那里。
同样,您也可以在float
中表示非常小的数字(介于0和1之间),但无论数字是非常大还是非常小,float
只有大约6的精度或7位小数。如果您有大数字,那么这些数字位于数字的开头(例如4.51534×10 35 ,这不超过451534跟随30个零 - 并且float
无法说出任何有用的信息对于非常小的数字(例如3.14159×10 -27 ),它们是数字的远端,超出了0.0000的起始位数。
答案 1 :(得分:2)
浮点数用于存储比整数更宽的数字范围。这些包括十进制数字和科学记数法样式编号,可以是大于32位的值。以下是对它们的深入研究:http://en.wikipedia.org/wiki/Floating_point