解决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;
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丢失精度的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中BigDecimal精度和相等比较的坑

    为什么要有BigDecimal ,他是干什么的 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,这时候就要使用BigDecimal啦. 什么是BigDecimal BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的

  • Java编程BigDecimal用法实例分享

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn

  • Java中BigDecimal的加减乘除、比较大小与使用注意事项

    前言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了BigDecimal ,关于BigDecimal 的介绍

  • Java中BigDecimal类与int、Integer使用总结

    前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题.如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); 输出: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.23299999999999

  • 解决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); } 运

  • 解决java.sql.Timestamp丢失精度的问题

    目录 java.sql.Timestamp丢失精度 需要重新补偿 java.sql.Timestamp类的使用 1. 获取当前时间 2.String类型转换为Timestamp 3.Timestamp转换为String类型 java.sql.Timestamp丢失精度 Timestamp的构造函数Timestamp(long time) 会丢失纳秒部分的精度 需要重新补偿 Timestamp t1 = Timestamp.valueOf("2019-12-13 15:19:53.2202080&

  • SpringBoot解决BigDecimal传到前端后精度丢失问题

    目录 简介 问题描述 实例 问题复现 Java后端BigDecimal的范围 解决方案 方案1:全局处理 方案2:局部处理 简介 本文用示例介绍SpringBoot如何解决BigDecimal传到前端后精度丢失问题. 问题描述 实例 Controller package com.knife.controller; import com.knife.entity.UserVO; import org.springframework.web.bind.annotation.GetMapping; i

  • Java序列化JSON丢失精度问题的解决方法(修复Long类型太长)

    目录 原因: 解决办法一: 解决办法(二): 总结 Java序列化JSON时long型数值,会出现精度丢失的问题. 原因: java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值). 解决办法一: 使用ToStringSerializer的注解,让系统序列化时,保留相关精度 @JsonSerialize(using=ToStringSerializer.class) private Long createdBy; 上述方法需要在每个对象都配上该注

  • SpringBoot2.0解决Long型数据转换成json格式时丢失精度问题

    目录 解决Long型数据转换成json格式时丢失精度 SpringBoot时间格式,Long型精度丢失常见问题 时间格式,Long型精度丢失 解决Long型数据转换成json格式时丢失精度 最近项目中突然发现雪花算法生成的数据库主键id返回给前端时和本身的值不一致,于是后端进行断点调试发现没问题,于是问题聚焦于转换json格式,于是自定义Json 格式化,因为使用Springboot,全是自动化配置,所以要覆盖框架本身的转换方式,经翻阅官方文档,提下下列注解,自定json转换 代码如下: @Js

  • SpringBoot全局配置long转String丢失精度问题解决方案

    web项目中,前端JS使用Java后端传过来的Long/long会丢失精度. 后端将返回的数据改为String使用即可 第一种 自己建个配置类 extends WebMvcConfigurerAdapter 已经被弃用,直接实现WebMvcConfigurer该接口就行了 @EnableWebMvc @Configuration public class WebDataConvertConfig implements WebMvcConfigurer { public void configur

  • SpringBoot全局配置long转String丢失精度的问题解决

    目录 第一种方式 第二种方式 第三种方式 第四种方式(缺点:将所有的数字类型都会转为字符串) web项目中,Java后端传过来的Long/long类型,前端JS接收会丢失精度. 本文推荐第三.第四种方式 第一种方式 简单粗暴,将所有的Lang类型,改为String,数据库改成varchar类型: 第二种方式 自己建个配置类 extends WebMvcConfigurerAdapter 已经被弃用,直接实现WebMvcConfigurer该接口就行了 @EnableWebMvc @Configu

  • 使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失

    忘记MySQL(和PHP搭配之最佳组合) ROOT密码是在MySQL(和PHP搭配之最佳组合)使用中很常见的问题,可是有很多朋友并不会重置ROOT密码,那叫苦啊,我有深有感触,特写此文章与大家交流: 1.编辑MySQL(和PHP搭配之最佳组合)配置文件: windows环境中:%MySQL(和PHP搭配之最佳组合)_installdir%\my.ini //一般在MySQL(和PHP搭配之最佳组合)安装目录下有my.ini即MySQL(和PHP搭配之最佳组合)的配置文件. linux环境中:/e

  • 基于axios 解决跨域cookie丢失的问题

    设置 axios.defaults.withCredentials = true 即可 示例代码: axios.defaults.withCredentials = true; var param = new URLSearchParams(); param.append("vCode",vcode); axios.post('http://localhost',param) .then(function(res) { var rs=res.data; console.log(rs.d

  • 解决django后台样式丢失,css资源加载失败的问题

    就像这个图的样子: 解决方法,setting.py中DEBUG选项为True,否则无法映射到静态文件目录 以上这篇解决django后台样式丢失,css资源加载失败的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐