Java中的数值类型之间的转换
(自己画的丑图)在图中黑色的线表示转化时不会损失精度,红色代表会出现精度损失。
在Java中:
- int占用4个字节,取值范围在-2147 438 648~2147 483 647(刚好超过20亿)
- float 占用4个字节,取值范围在-3.402 823 47E+38F~3.402 823 47E+38F
单纯从取值范围,float的取值范围更大,因此这样看应该不丢失精度。但是我们看看下面的代码:
int n = 123456789;
float f =n;
运行结果是:1.23456792E8,从结果看很明显有精度的丢失,为何会如此这涉及到浮点数在计算机中的表示方式。
小数在计算机的表示方式
其实在计算中表示小数的方式有两种:定点表示和浮点表示。定点表示我就不介绍了,较为简单,容易产生溢出(想了解可以百度)。
浮点数 (自画丑图)
浮点数是由阶码j和尾数s两部分组成的。阶码是整数,阶符和阶码的位数m合起来反应浮点数的范围及小数点的实际位置;尾数是小数,其数位n反应了浮点数的精度;尾数的符号sf代表浮点数的正负。到这里大概了解了浮点数的在计算机在表示方式。
现在我们说回float,float是一个占用4个字节的浮点数:其中一位是符号位,8位指数位,23位尾数位。当指数位全部为0时省略的是0否则省略的是1;尾数23位加上省略的1位,float的精确度有24位。
而对于int而言它的精度时32位,尽管float的取值范围更大些,但是精度却不如int。这就解释了为什么int转化成float后可能出现精度损失。
最后想说,我画的图真心难看(大家可以查相关书籍,图更好看些),感谢包含。