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的性能高。

posted on 2023-08-30 14:59  lvguoliang(学无止境)  阅读(41)  评论(0)    收藏  举报