标签:big 精度 换问题 丢失 als 之间 src inf 精确
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 种类型之间的转换。
下面来看下数值类型之间的合法转换图。
图中的实线箭头表示有信息丢失的转换,虚线箭头表示无信息丢失的转换。其转换规则如下:
枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。
这个问题涉及到二进制与十进制的转换问题。
N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×102+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)再转换为浮点数。
标签:big 精度 换问题 丢失 als 之间 src inf 精确
原文地址:https://www.cnblogs.com/adret/p/9752064.html