一、数据类型之间的转换
1.自动类型转换:
2.强制类型转换:
简单来说,强制类型的转换就是在想要转换的变量前面加一个(),并在()里写上想要转换的类型,如图所示,但是要注意在进行强制类型转换的时候会出现精度丢失的情况。
二、浮点型的精度丢失
1.浮点类型在计算机当中的存储
首先我们来看一下浮点类型在我们的计算机当中是如何存储的
- float存储需求是4字节(32位), 其中1位最高位是符号位,中间8位表示阶位,后32位为数值位
- double存储需求是8字节(64为),其中1位最高位是符号位,中间11位表示阶位,后52位为数值位。
double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。例如,用7位有效数字足以精确地表示普通雇员的年薪,但表示公司总裁的年薪可能就不够用了。实际上,只有很少的情况适合使用float类型,例如,需要快速地处理单精度数据,或者需要存储大量数据。
2.浮点型的精度丢失
①:产生精度丢失的原因
首先我们看一个例子
这和我们预期的情况完全不符,然后我们来将10进制的0.2转化为2进制进行存储
算法是乘以2直到没有了小数为止
- 0.2 * 2 = 0.4 取整数部分 0
- 0.4 * 2 = 0.8 取整数部分 0
- 0.8 * 2 = 1.6 取整数部分 1
- 0.6 * 2 = 1.2 取整数部分 1
- 0.2 * 2 = 0.4 取整数部分 0
- 。。。。。。 。。。。。。
0.2的2进制从上到下可以表示为 00110011......
注意:上面的计算过程循环了,也就是说*2永远不可能消灭小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的 。其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10。这也就解释了为什么浮点型减法出现了"减不尽"的精度丢失问题。
还有更多点开下方链接查看
精度丢失就是我们的位数不够表示我们整个数值了
②:如何解决精度丢失
警告:浮点数值不适用于禁止出现舍入误差的金融计算中。例如,命令System out println
(2.0-1.1 )将打印出0.899999999999999, 而不是人们想象的0.9。其主要原因是浮点
数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10。这就好像十进
制无法精确地表示1/3一样。如果需要在数值计算中不含有任何舍入误差,就应该使用
BigDecimal类。