随笔1

Java基本数据类型

byte 字节型   1字节(8bit) 初始值:0

char 字符型   2字节(16bit) 初始值:空格

short 短整型   2字节(16bit) 初始值:0

int 整型   4字节(32bit) 初始值:0

long 长整型   8字节(64Bit) 初始值:0L

float 单精度浮点型   4字节(32bit) 初始值:0.0f

double 双精度浮点型   8字节(64bit) 初始值:0.0d

boolean java未明确指出的大小(可能1bit、1byte、4byte) 初始值:false

 

Java中有两种转换类型

1.自动类型转换:编译器自动完成类型转换,不需要在程序中编写代码。

2.强制类型转换:强制编译器进行类型转换,必须在程序中编写代码。

由于基本数据类型中 boolean 类型不是数字型,所以基本数据类型的转换是出了 boolean 类型以外的其它 7 种类型之间的转换。

下面来看下数值类型之间的合法转换图。

图中的实线箭头表示有信息丢失的转换,虚线箭头表示无信息丢失的转换。其转换规则如下:

  • 如果两个操作数中有一个是double类型,另一个就会转换为double类型;
  • 否则,如果有一个操作数是float,另一个就会转化为float;
  • 否则,如果有一个操作数是long,另一个就会转换为long;
  • 否则,两个操作数都将转换为int类型。

 

 

 

枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。

 

 

这个问题涉及到二进制与十进制的转换问题。

N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。

double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。

举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。

简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

浮点数在计算机内部的表示方法,可以看https://blog.csdn.net/sinat_34032056/article/details/68566614

处理这类问题,可以使用BigDecimal类,在构建BigDecimal对象时应使用字符串而不是double数值。否则,仍有可能引发计算精度问题。

java.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法:

第一种:BigDecimal(double val)
Translates a double into a BigDecimal.

第二种:BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.

使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。

posted on 2018-10-07 23:28  哈弗h6  阅读(129)  评论(0编辑  收藏  举报

导航