当大小相同时,float和integer数据类型有什么区别?

akk*_*akk 35 java floating-point integer

当大小相同时,float和integer数据类型之间有什么区别?

Joe*_*oey 88

  • float 存储浮点值,即具有潜在小数位的值
  • int 仅存储整数值,即整数

因此,虽然两者都是32位宽,但它们的使用(和表示)却完全不同.你不能以整数存储3.141,但你可以在一个float.

将它们进一步解剖:

在整数中,所有位用于存储数值.这是(在Java和许多计算机中)在所谓的二进制补码中完成的.这基本上意味着您可以表示-2 31到2 31  - 1的值.

在浮点数中,这32位在三个不同的部分之间划分:符号位,指数和尾数.它们的布局如下:

S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
Run Code Online (Sandbox Code Playgroud)

有一个位确定数字是负数还是非负数(零既不是正数也不是负数,但是符号位设置为零).然后有八位指数和23位尾数.为了从中获得有用的数字,(大致)执行以下计算:

M ×2 E.

(还有更多,但这应该足以满足本次讨论的目的)

尾数本质上不超过24位整数.这将乘以指数部分的幂乘以2,这大致是-128到127之间的数字.

因此,您可以准确地表示适合24位整数的所有数字,但数值范围也要大得多,因为较大的指数允许更大的值.例如,a的最大值float约为3.4×10 38,int仅允许值最大为2.1×10 9.

但这也意味着,因为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.

类似地,您也可以在a中表示非常小的数字(在0和1之间),float但无论数字是非常大还是非常小,float只有大约6或7个十进制数字的精度.如果您有大数字,那么这些数字位于数字的开头(例如4.51534×10 35,这不超过451534跟随30个零 - 并且float不能告诉任何有用的关于这30个数字是否实际为零或其他东西),对于非常小的数字(例如3.14159×10 -27),它们位于数字的远端,超出了0.0000的起始位数...

  • 值得注意的是,即使两种数据类型具有相同的大小(32位),用于表示两种数据类型中相同数字的位模式也大不相同.例如,无符号整数1的位模式是00 ... 001,而浮点1.0的位模式完全不同. (4认同)
  • 一个微妙的观点是浮点数实际上不支持小数位.它们不是小数点,而是小数点.在所有实际情况中,基数为2.(十进制浮点数已由IEEE标准化,但未广泛使用.)这种区别可能很重要,尤其是在对舍入敏感的应用程序(如金融应用程序)中. (2认同)
  • @凯文:确实如此。不过,我把这个答案保持得非常肤浅,因为我认为如果有人甚至不知道 FP 和整数类型之间的区别,那么仍然需要做很多解释。但是,是的,您几乎永远不希望浮点数接近货币价值。 (2认同)