案例:ZJJ_JavaBasic_2020/02/17_10:20:43_cpk3z


数据类型
位数
默认值
取值范围
数据范围 举例说明
byte(位) 8 0 -2^7 - 2^7-1 -128 - 127 byte b = 10;
short(短整数) 16 0 -2^15 - 2^15-1 -32768 - 32767 short s = 10;
int(整数) 32 0 -2^31 - 2^31-1 -2147483648 - 2147483647 int i = 10;
long(长整数) 64 0 -2^63 - 2^63-1 -9223372036854775808 - 9223372036854775807 long l = 10l;
float(单精度) 32 0.0 -2^31 - 2^31-1 1.4E-45 - 3.4028235E38 float f = 10.0f;
double(双精度) 64 0.0 -2^63 - 2^63-1 4.9E-324 - 1.7976931348623157E308 double d = 10.0d;
char(字符) 16 0 - 2^16-1 - ? char c = ‘c’;
boolean(布尔值) 8 false true、false -128 - 127 boolean b = true;


此处为什么输出char的数据范围不是0 - 65535呢?
Java中的char类型由两个字节即十六位来表示,因为是无符号数,所以为2的16次方,数值范围就为:0 - 2^16-1;


单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例如,当表示美元和分时,单精度浮点型是有用的。
这是一些声明单精度浮点型变量的例子:float hightemp,lowtemp;

双精度型,正如它的关键字“double ”表示的,占用64位的存储空间。在一些现代的被优化用来进行高速数学计算的处理器上双精度型实际上比单精度的快。所有超出人类经验的数学函数,如sin( ),cos( ) ,和sqrt( )均返回双精度的值。当你需要保持多次反复迭代的计算的精确性时,或在操作值很大的数字时,双精度型是最好的选择。


数据类型转换


自动类型转换:
小的数据值转大的数据类型,可以自动转换
格式:
大的数据类型 变量名= 小的数据值;
列如: double a=3;
强制类型转换:
大的数据值转小的数据类型,必须强制转换;
格式:
小的数据类型 变量名 =(小的数据类型)大的数据值
列如:
int a=(int)3.9;
大的数字转小的会损失精度.小的转大的不会损失.

精度问题

Java中的简单浮点数类型float和double不能够进行运算,或者运算会丢失精度,不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal.

当然,如果业务合适的话,用int 或者 long来存金额, 单位是 分 ,如果是大型的财务系统还是老老实实用BigDecimal


为什么会丢失精度:
参考:
https://www.yuque.com/docs/share/37fce588-f92f-49a1-922b-97f6f64081a1?#

演示精度丢失

精度不准确的

  1. @Test
  2. public void c_浮点型计算不准确示例() {
  3. //下面是经度不准确的
  4. System.out.println(0.05 + 0.01); //0.060000000000000005
  5. System.out.println(1.0 - 0.42); //0.5800000000000001
  6. System.out.println(4.015 * 100); //401.49999999999994
  7. System.out.println(123.3 / 100); //1.2329999999999999
  8. System.out.println(Math.round(4.015 * 100) / 100.0); //4.01
  9. }

精度准确的

  1. @Test
  2. public void c_浮点型计算不准确示例2() {
  3. //下面都是准确的
  4. System.out.println(0.03 + 0.0101); // 0.0401
  5. System.out.println(1.0 - 0.52); // 0.48
  6. System.out.println(4.235 * 1000); // 4235.0
  7. System.out.println(13.3 / 100); // 0.133
  8. }