解决BigDecimal转long丢失精度的问题
我就废话不多说了,⼤家还是直接看代码吧~
public static void main(String[] args) {
BigDecimal asdBigDecimal = new BigDecimal(56.33347);
long sad = asdBigDecimal.longValue();
double asda = asdBigDecimal.doubleValue();
System.out.println(sad);
System.out.println(asda);
}
运⾏结果:
56
56.33347
⽽且BigDecimal.longValue()还会⾃动四舍五⼊,不想舍去⼩数点的朋友要⽤doubleValue()
补充知识:BigDecimal与int、long之间的相互转换及基本数据类型知识掌握
(Java提供了两个⽤于⾼精度计算的类:BigInteger和BigDecimal。这两个类包含的⽅法、提供的操作与对基本类型所能执⾏的操作相似,只不过是以⽅法调⽤⽅式取代运算符⽅式来实现。等于是⽤速度换取了精度。 BigInteger⽀持任意精度的整数,在运算中可以准确地表⽰任何⼤⼩的整数值,⽽不会丢失任何信息。BigDecimal⽀持任何精度的定点数,可以⽤它进⾏精确的货币计算。
它们都扩展Number类且实现Comparable接⼝,可以使⽤new BigInteger(String)或new BigDecimal(String)来创建实例,使⽤add,substract,multiple,divide和remainder⽅法完成算数运算,使⽤compareTo⽅法⽐较两个⼤数字。
⼀般来说,BigInteger⽤的不是很多,BigDecimal⽤的稍微多⼀点,就⽐如说JDBC中,如果⼀个字段的数据库类型是Number, 那么getObject().getClass()的结果是java.math.BigDecimal。 
BigInteger相⽐Integer的确可以⽤big来形容。它是⽤于科学计算,Integer只能容纳⼀个int, 所以最⼤值也就是2的31次访减去1,⼗进制为2147483647,如果需要计算更⼤的数,那么31位显然是不够⽤
了,BigInteger能够容纳的位数那可就⼤了,我简单试了⼀下,上千位没有任何问题。除了容量⼤之外,BigInteger还封装了⼀些常见的操作,⽐如+-*/的基本操作,还有绝对值,相反数,最⼤公约数,是否是质数等等的运算。 
BigDecimal的实现利⽤到了BigInteger, 所不同的是BigDecimal加⼊了⼩数位的概念,⽐如BigDecimal d = new BigDecimal(new BigInteger(ib),5);5表⽰的是5个⼩数位。BigDecimal可以⽤来做超⼤的浮点数的运算,⽐如+-*/的运算,其中除法运算是最复杂的,因为商的位数还有除不断的情况下末位⼩数点的处理都是需要考虑的。)
我们在实际开发过程中,BigDecimal是经常⽤到的⼀个数据类型,它和int、long之间可以项⽬转换。
int 转换成 BigDecimal 数据类型
 //int 转换成 bigDecimal类型
public static void intToBigDecimal(){
int b = 5;
BigDecimal a = new BigDecimal(b);
System.out.println(a +"的数据类型是"+a.getClass().getName());
}
Long转换成 BigDecimal 数据类型
 //Long 类型转换成 bigDecimal
public static void longToBigDecimal(){
long b = 5;
BigDecimal a = new BigDecimal(b);
System.out.println(a +"的数据类型是"+a.getClass().getName());
}
BigDecimal 转换成 Long数据类型
 //bigDecimal 转换成 Long类型
public static void bigDecimalToLong(){
BigDecimal b = new BigDecimal(12);
Long c = b.longValue();
System.out.println(c+"的数据类型是"+c.getClass().getName());
}
BigDecimal 转换成 int数据类型
  //bigDecimal 转换成 int类型
public static void bigDecimalToInt(){
BigDecimal b = new BigDecimal(12);
int c = b.intValue();
}
附:基本数据类型及所占位数及初始值
基本数据类型所占位数初始值
byte字节型 1字节(8bit)0
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
char字符型 2字节(16bit)空格
附:java的数据类型
附:转换中的知识点
java中整数类型默认的int类型;⼩数类型默认的double;
*char 可以当做⼀中特殊的整数类型;
*int⽆法转换为boolean;
*⼩数类型转为整数类型,⼩数可能被舍弃,所有出现精度损失,所以需要强制转换;
*boolean 类型不能转换成任何其它数据类型;
byte b2 = 120;
//没报错的原因:
//编译时候,进⾏检查,看赋值⼤⼩是否超过变量的类型所容纳的范围
//如果超过,报错:从int转换到byte可能会有损失,如果没超过,编译通过
float f3 = 100L; 这种情况,整数部分,可以直接赋值给float整数部分
float f1 = 100.9; 这种情况,因为默认的是double,如果这样转换,有可能失去⼩数点,必须强制转换long l3 = 1000.9f; ⼩数转为整数,⼩数可能丢失,需要强制转换
double d2 = 10.9d;
bigdecimal除法保留小数int i2 = d2; //错误: 不兼容的类型: 从double转换到int可能会有损失
char c1 = 'a';
int i3 = c1; //⾃动转换
int i4 = 100;
//char c2 = i4;// 错误: 不兼容的类型: 从int转换到char可能会有损失
附:四则运算
/*
1、如果两个操作数中有⼀个是double类型,另⼀个就会转换为double类型;
2、否则,如果有⼀个操作数是float,另⼀个就会转化为float;
3、否则,如果有⼀个操作数是long,另⼀个就会转换为long;
4、否则,两个操作数都将转换为int类型。
*/
附:⾯试陷阱
byte b1 = 10;
byte b2 = 11;
//错误: 不兼容的类型: 从int转换到byte可能会有损失
//否则,两个操作数都将转换为int类型。
byte b3 = b1 + b2 //错误
byte b3 = (byte)(b1 + b2); //正确
short s1 = 1;
s1 = s1 + 1; //错误: 不兼容的类型: 从int转换到short可能会有损失
short s2 = 1;
s2 += 1; // 等同于short s2 = (short)(s2 + (short)1); //正确
附:从⼩到⼤顺序
附:隐式转换、显式转换
当将占位数少的类型赋值给占位数多的类型时,java⾃动使⽤隐式类型转换(如int型转为long型)
当把在级别⾼的变量的值赋给级别低变量时,必须使⽤显式类型转换运算(如double型转为float型)
附:什么是不可变对象
不可变对象指对象⼀旦被创建,状态就不能再改变。任何修改都会创建⼀个新的对象,如String、Integer及其它包装类。
以上这篇解决BigDecimal转long丢失精度的问题就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。