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的起始位数...
| 归档时间: |
|
| 查看次数: |
147282 次 |
| 最近记录: |