解决BigDecimal转long丢失精度的问题
作者:昊Zz 发布时间:2022-07-16 13:44:22
我就废话不多说了,大家还是直接看代码吧~
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;
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及其它包装类。
来源:https://www.cnblogs.com/zhouhao666/p/9994926.html


猜你喜欢
- 一. 思路今天接到个小任务,让把json文件转换成excel文件,按照列展开.思路:既然json已经都已经是现成的,那直接将jso
- 一直以来,我们都是在服务端查询出结果生成JSON字符串,供前端调用,那么我们能否把从前端接受的JSON字符串转换成字典集合,让后台处理呢?比
- 在一个项目中我们可能会需要用到相同的布局设计,如果都写在一个xml文件中,代码显得很冗余,并且可读性也很差,所以我们可以把相同布局的代码单独
- 题目一??解法/** * Definition for singly-linked list. * public class ListNod
- 开发环境安装JDK和JRE下载安装文件并安装:jdk-8u11-windows-i586.exejre-8u11-windows-i586.
- 为Repository添加自定义方法一、为某个Repository添加自定义方法1、定义一个接口PersonDao,声明要添加的方法。pub
- 目录前言简介在Java上使用创建项目,并引入Jar包导入traineddata编写测试代码训练工具训练数据仓库参考前言Tesseract-O
- 记录单击、双击实现过程,进行简单的封装,便于复用,包括常用的软件双击退出。双击实现:记录第一次点击时间,在设定时间内再次点击,则返回监听事件
- 本文实例为大家分享了使用aop实现全局异常处理的具体代码,供大家参考,具体内容如下日常业务中存在的问题使用大量的try/catch来捕获异常
- 如题,主要使用AsReadOnly这个方法就可以了List<int> a = new List<int> {1, 2
- 本文将介绍一段实例代码,来讲解利用正则表达式使C#判断输入日期格式是否正确的方法。希望这段代码能对大家有所帮助。 通常我们在用C#
- 1.map遍历快速实现边距,文字自适应改变大小Container( // padding: EdgeI
- 前言Zuul 是Netflix 提供的一个开源组件,致力于在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。也有很多公司使用它来作为
- 前言:这个语句的作用是,确保该语句执行之后,关闭每一个资源,也就是说它确保了每个资源都在生命周期结束之后被关闭,因此,比如读写文
- Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。
- 前景概要在这个之前service_edu子模块下的功能是没有任何问题,创建了service_oss子模块之前失败了很多次,影响到了之前原本正
- 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void通
- 延迟赋值主要有两点:1.一个参数可能或可能没被赋值.2.一个参数在一个函数中每次使用时可能被赋值.如下面的这种情况:int Add(int
- 本文实例讲述了C#中DataSet转化为实体集合类的方法,分享给大家供大家参考。具体实现方法如下:/// <summary>//
- Mybatis与Ibatis的区别: 1、Mybatis实现了接口绑定,使用更加方便 在ibatis2.x中我们需要在DAO的实现类中指定具