在金额使用中我们经常会涉及到小数部分,小数的精度很令人困扰
简单了解了一下:
- 1.在计算机中编程采用的数学建模为二进制方式,二进制进行位运算已久会产误差,数据只会无限接近
- 2.计算机的内存是有限的,简单来说提供的内存越多,可计算的小数位数更多,更趋向精确
1.小数我们第一个想到的是浮点型Float
Float floatA = 90.7f;
Float floatB = 10.3f;
System.out.println("float浮点型测试:"+ floatA*floatB);
但测试结果在小数开始出现错误
float浮点型测试:934.20996
2.试试双精度Double
Double doubleA = 90.7;
Double doubleB = 10.3;
System.out.println("double双精度测试:"+ doubleA*doubleB);
但测试结果同样在小数开始出现错误,只是相较Float误差较少
double双精度测试:934.2100000000002
3.提升最小单位去除小数?
Integer integerA = 127;
Integer integerB = 127;
System.out.println("Integer 缓存内比较:"+(integerA==integerB));
Integer integerC = 128;
Integer integerD = 128;
System.out.println("Integer 缓存外比较:"+(integerC==integerD));
Integer IntegerE = 1000000;
Integer IntegerF = 200000;
System.out.println("int 溢出计算:"+IntegerE*IntegerF);
- Integer,在Java的API定义中,-128~127是会进行缓存的,翻译为Integer.valueOf(),但超出这个范围则不会;
- int,int的取值范围为-2147483648——2147483647,共计10位无符号当我们提升小数位为整数位时,涉及数额较大时会溢出
Integer 缓存内比较:true
Integer 缓存外比较:false
int 溢出计算:-1863462912
long足以满足我们日常所用的数值,但是我们避免不了使用除法
Long longA = Long.valueOf(123456);
Long longB = Long.valueOf(7);
System.out.println("long与小数计算:"+longA/longB);
结果,小数位丢失
long与小数计算:17636
3.使用BigDecimal,大数、精确计算,满足你的一切要求
但是在BigDecimal中值的初始化划分为数字初始化和字符初始化
BigDecimal numA = new BigDecimal(1234.567);
BigDecimal numB = new BigDecimal(0.123);
System.out.println("数字初始化计算:"+numA.multiply(numB));
BigDecimal stringA = new BigDecimal("1234.567");
BigDecimal stringB = new BigDecimal("0.123");
System.out.println("字符初始化计算:"+stringA.multiply(stringB));
数字初始化计算出现精度问题,而字符则不会
数字初始化计算:151.85174099999999870191125239671235775781068223113496294673918640683041303418576717376708984375
字符初始化计算:151.851741