Java基本数据类型
| 数据类型 | 字节数 | 取值范围 |
| boolean | ||
| char | 2 | |
| byte | 1 | -128~127 |
| short | 2 | -32768~32767 |
| int | 4 | -2147483648~2147483647 |
| long | 8 | -9223372036854775808~9223372036854775807 |
| float | 4 | |
| double | 8 |
double和float的区别?
double有效位数16位, float有效位数是8位, 也就是小数和整数位加起来最多8位。double精度高,但double消耗内存是float的两倍,double的运算速度比float慢得多,能用单精度时不要用双精度。 Java中默认声明的小数是double类型的。如声明 float a = 4.1会报错, 应该是 float = 4.1f。
BigDecimal为何精度不丢失?
首先我们要知道为什么会精度丢失?
float a = 2.0f - 1.9f;
System.out.println(a);
输出结果:0.100000024
浮点数是由符号位、指数和尾数组成的。计算机也只能识别0和1。那一个小数是怎么转成二进制存储的呢。它是乘以2,取整数部门。然后小数部门再乘以2,直到结果为1。如0.125转成二进制。
0.125 x 2 = 0.25 0
0.25 x 2 = 0.5 0
0.5 x 2 = 1 1
所以0.125转成二级制就是0.001。这种位数是固定的,有些小数转完位数可能是无限的。如0.2
0.2 x 2 = 0.4 0
0.4 x 2 = 0.8 0
0.8 x 2 = 1.6 1
0.6 x 2 = 1.2 1
0.2 x 2 = 0.4 0
...
这种小数转完二进制就是无限的,而存储的位数是有限的。所以就会造成精度丢失。十进制整数转二进制是不会有精度丢失问题的, BigDecimal就是把数据扩大多少倍让它在整数的维度计算,并保留相应的精度信息。要注意的是构建BigDecimal对象,要
使用字符串创建或者用BigDecimal.valueOf,底层也是转成字符串。如果直接用double构建也是会造成精度丢失,原理前面也介绍了。double的值是不固定的,而计算机的存储位数有限。
数据库存储金额字段用那种类型?
一般情况用decimal存储, decimal是定点数据类型,长度固定不会丢失精度。数据量大的时候可以用BIGINT存储,乘以相应得倍数。这样计算时会比decimal的性能高。
浙公网安备 33010602011771号