一、double和float的区别
float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间
double是双精度类型,精度是17位有效数字,取值范围是10的-308次方到10的308次方,double占用8个字节的存储
为了和double区别,float型订一的数据末尾必须有f 例如:float a= 1.0f,如图如果不加f会报错,java:不兼容类型:从double转换到float可能会有损失
为什么会报上边的错误?
因为java默认的浮点型是double ,如果不加f java会默认为数据是double,然后会进行数据转换,在转换的过程中报了错。这种转换叫做窄化转换,窄化转换就是是强制类型转换,一种有高到底的转换方式。
二、浮点型
然后我们说一下浮点型的计算问题:
在任何编译环境下,都要把源程序翻译成二进制的机器码才能被计算机识别,浮点型分为两部分组成,指数和尾数,如下图所示,结果应该是0.05,但是输入结果确实0.0499999…无限接近0.05。
原因在于浮点如果在这个转换过程中,浮点数参与了计算,那么转换的过程就会变得不可预知,并且变得不可逆.所以,就是在这个过程中,发生了精度的丢失。为什么有些浮点计算会得到准确的结果,应该也是碰巧那个计算的二进制与 十进制之间能够准确转换。
事实上,浮点数并不适合用于精确计算,而适合进行科学计算。:既然float和double型用来表示带有小数点的数,那为什么我们不称 它们为“小数”或者“实数”,要叫浮点数呢?因为这些数都以科学计数法的形式存储。当一个数如111111111111111.11-0.42,转换成科学计数法的形式为1.1111111111111069E14,它 的小数点移动到了一个新的位置(即浮动了)。可见,浮点数本来就是用于科学计算的,用来进行精确计算实在太不合适了,推荐大家计算的时候用BigDecimal