-
2021-04-27 09:05:43
解决科学计数法问题:
当Bigdecimal 类型值为0.00006时转成Double会变成科学计数法
/**
* 取消科学计数法
*/
public String getPrincipal(Double principal){
NumberFormat nf = NumberFormat.getInstance();
//设置保留多少位小数
nf.setMaximumFractionDigits(6);
// 取消科学计数法
nf.setGroupingUsed(false);
return nf.format(principal);
}
一个很好用的方法更多相关内容 -
Java BigDecimal和double-BigDecimal转double-double转BigDecimal
2018-01-18 11:53:50对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。 表11-15 ...BigDecimal类
对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。
表11-15 BigDecimal类的常用方法
序号
方 法
类型
描 述
1
public BigDecimal(double val)
构造
将double表示形式转换
为BigDecimal
2
public BigDecimal(int val)
构造
将int表示形式转换为
BigDecimal
3
public BigDecimal(String val)
构造
将字符串表示
形式转换为BigDecimal
4
public BigDecimal add(BigDecimal augend)
普通
加法
5
public BigDecimal subtract(BigDecimal
subtrahend)普通
减法
6
public BigDecimal multiply(BigDecimal
multiplicand)普通
乘法
7
public BigDecimal divide(BigDecimal
divisor)普通
除法
范例:进行四舍五入的四则运算
package org.lxh.demo11.numberdemo; import java.math.BigDecimal; class MyMath { public static double add(double d1, double d2) { // 进行加法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.add(b2).doubleValue(); } public static double sub(double d1, double d2) { // 进行减法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.subtract(b2).doubleValue(); } public static double mul(double d1, double d2) { // 进行乘法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.multiply(b2).doubleValue(); } public static double div(double d1, double d2,int len) {// 进行除法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.divide(b2,len,BigDecimal. ROUND_HALF_UP).doubleValue(); } public static double round(double d, int len) { // 进行四舍五入 操作 BigDecimal b1 = new BigDecimal(d); BigDecimal b2 = new BigDecimal(1); // 任何一个数字除以1都是原数字 // ROUND_HALF_UP是BigDecimal的一个常量, 表示进行四舍五入的操作 return b1.divide(b2, len,BigDecimal. ROUND_HALF_UP).doubleValue(); } } public class BigDecimalDemo01 { public static void main(String[] args) { System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345, 3.333), 1)); System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345, 3.333), 3)); System.out.println("除法运算:" + MyMath.div(10.345, 3.333, 3)); System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345, 3.333), 3)); } }
BigDecimal是Java中用来表示任意精确浮点数运算的类,在BigDecimal中,使用unscaledValue × 10-scale来表示一个浮点数。其中,unscaledValue是一个BigInteger,scale是一个int。从这个表示方法来看,BigDecimal只能标识有限小数,不过可以表示的数据范围远远大于double,在实际应用中基本足够了。
下面提一下两个精度问题:问题一:BigDecimal的精度问题(StackOverflow上有个家伙问了相关的问题)System.out.println(new BigDecimal(0.1).toString()); // 0.1000000000000000055511151231257827021181583404541015625 System.out.println(new BigDecimal("0.1").toString()); // 0.1 System.out.println(new BigDecimal( Double.toString(0.1000000000000000055511151231257827021181583404541015625)).toString());// 0.1 System.out.println(new BigDecimal(Double.toString(0.1)).toString()); // 0.1
分析一下上面代码的问题(注释的内容表示此语句的输出)
第一行:事实上,由于二进制无法精确地表示十进制小数0.1,但是编译器读到字符串"0.1"之后,必须把它转成8个字节的double值,因此,编译器只能用一个最接近的值来代替0.1了,即0.1000000000000000055511151231257827021181583404541015625。因此,在运行时,传给BigDecimal构造函数的真正的数值是0.1000000000000000055511151231257827021181583404541015625。第二行:BigDecimal能够正确地把字符串转化成真正精确的浮点数。第三行:问题在于Double.toString会使用一定的精度来四舍五入double,然后再输出。会。Double.toString(0.1000000000000000055511151231257827021181583404541015625)输出的事实上是"0.1",因此生成的BigDecimal表示的数也是0.1。第四行:基于前面的分析,事实上这一行代码等价于第三行结论:1.如果你希望BigDecimal能够精确地表示你希望的数值,那么一定要使用字符串来表示小数,并传递给BigDecimal的构造函数。2.如果你使用Double.toString来把double转化字符串,然后调用BigDecimal(String),这个也是不靠谱的,它不一定按你的想法工作。3.如果你不是很在乎是否完全精确地表示,并且使用了BigDecimal(double),那么要注意double本身的特例,double的规范本身定义了几个特殊的double值(Infinite,-Infinite,NaN),不要把这些值传给BigDecimal,否则会抛出异常。问题二:把double强制转化成int,难道不是扔掉小数部分吗?int x=(int)1023.99999999999999; // x=1024为什么?
原因还是在于二进制无法精确地表示某些十进制小数,因此1023.99999999999999在编译之后的double值变成了1024。
所以, 把double强制转化成int确实是扔掉小数部分,但是你写在代码中的值,并不一定是编译器生成的真正的double值。验证代码:double d = 1023.99999999999999; int x = (int) d; System.out.println(new BigDecimal(d).toString()); // 1024 System.out.println(Long.toHexString(Double.doubleToRawLongBits(d))); // 4090000000000000 System.out.println(x); // 1024
前面提过BigDecimal可以精确地把double表示出来还记得吧。
我们也可以直接打印出d的二进制形式,根据IEEE 754的规定,我们可以算出0x4090000000000000=(1024)。 -
Java BigDecimal类的一般使用、BigDecimal转double
2020-06-27 19:31:11BigDecimal大据类。 浮点型运算的时候直接 加减乘除时可能会出现数据失真(精度问题)。 BigDecimal可以解决浮点型运算数据失真的问题。 double a = 0.1; double b = 0.2; double c = a+b; System.out.println(c);...BigDecimal大据类。
浮点型运算的时候直接 加减乘除时可能会出现数据失真(精度问题)。
BigDecimal可以解决浮点型运算数据失真的问题。double a = 0.1; double b = 0.2; double c = a+b; System.out.println(c);//0.30000000000000004
BigDecimal类
包: java.math.
创建一个BigDecimal对象
public static BigDecimal valueOf(double val)
方法声明
public BigDecimal add (BigDecinal value) 加法运算
public BigDecimal subtract (BigDecimal value)减法运算
public BigDecimal multiply(BigDecimal value)乘法运算
public BigDecimal divide (BigDecimal value)除法运算
BigDecimal biga = BigDecimal.valueOf(a); BigDecimal bigb = BigDecimal.valueOf(b); BigDecimal bigc = biga.add(bigb); System.out.println(bigc);//0.3
BigDecimal转double
public double doubleValue()
然而BigDecimal只是解决精度问题的手段,获取double数据才是我们的目的
double rs = bigc.doubleValue();
-
java.math.BigDecimal转换double double转换java.math.BigDecimal
2018-06-19 11:07:18有方法 java.math.BigDecimal.doubleValue() BigDecimal a = new BigDecimal(1000); return a.doubleValue(); public static void printDoubleToBigDecimal(double v1, double v2){ BigDecimal d1TobigDe...有方法 java.math.BigDecimal.doubleValue() BigDecimal a = new BigDecimal(1000); return a.doubleValue();
- public static void printDoubleToBigDecimal(double v1, double v2){
- BigDecimal d1TobigDe = new BigDecimal(v1);
- BigDecimal d2TobigDe = new BigDecimal(v2);
- System.out.println("d1TobigDe="+d1TobigDe);
- System.out.println("d2TobigDe="+d2TobigDe);
- }
-
String转BigDecimal转Double
2020-09-01 22:27:42public static void main(String[] args) { String s = "123.94752719"; //String转BigDecimal BigDecimal big = new BigDecimal(s);... //BigDecimal转Double保留小数(几个0就是几位小数) Strin -
java中double转化为BigDecimal精度缺失的实例
2020-08-31 04:59:01下面小编就为大家带来一篇java中double转化为BigDecimal精度缺失的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
BigDecimal向Double转换
2017-06-22 16:44:45BigDecimal向Double转换 -
BigDecimal和double类型相互转换,一行搞定
2021-09-10 17:42:20BigDecimal类型和double类型的值相互转换 1.BigDecimal转double,使用BigDecimal类里面doubleValue()...2.double转BigDecimal,使用BigDecimal类里面valueOf()方法: double latitudeDou = 39.97268600; BigDecimal lat -
使用BigDecimal替代Double完成精确计算
2021-12-12 15:45:25相关知识: 小数的二进制表示和计算 BigDecimal的基础使用 构造器 BigDecimal(int) 创建一个具有参数所指定整数值的对象 BigDecimal(double) 创建一个具有参数所指定双精度值的对象 BigDecimal(long) 创建一个具有... -
BigDecimal 与double数据类型转换 同时保留两位小数
2020-04-12 21:59:40https://blog.csdn.net/fzy629442466/article/details/85765944?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCom... -
Java double转bigDecimal时精度丢失问题
2022-04-07 08:52:50使用new BigDecimal(double val)对doubel进行转换会导致转换后精度丢失 原因 BigDecimal的构造函数public BigDecimal(double val)会损失了double 参数的精度。jdk中已经明确不建议使用new BigDecimal(double value)... -
Java Double转Bigdecimal丢失精度原因学习
2021-12-03 10:11:35记录学习Double转Bigdecimal丢失精度的原因 注意事项: 不能直接使用Bigdecimal的构造函数传double进行转换,部分数值会丢失精度,因为计算机是二进制的Double无法精确的储存一些小数位,0.1的double数据存储的值... -
BigDecimal 保留double类型返回的两位小数
2020-02-18 16:52:41BigDecimal b = new BigDecimal(webResponse.getGmv()); webResponse.setGmv(b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); -
Java BigDecimal和double
2019-05-22 17:16:51Java BigDecimal和double -
Java BigDecimal和double示例及相关问题解析
2020-08-28 20:13:38主要介绍了Java BigDecimal和double示例及相关问题解析,简单介绍了BigDecimal类的相关内容,分享了两则相关实例,对问题进行了分析,具有一定参考价值,需要的朋友可以了解下。 -
Java中double转BigDecimal的注意事项
2018-08-10 16:01:20先上结论:不要直接用double变量作为构造BigDecimal的参数。 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3。 2,解析JSON并把这个数字保存在一个float变量。 3,把这个float... -
BigDecimal使用及Double运算精度丢失问题处理
2021-03-12 09:20:04BigDecimal使用及Double运算精度丢失问题处理 BigDecimal使用(优点:可保持计算精度) 运算公式: public BigDecimal add(BigDecimal value);//加法 public BigDecimal subtract(BigDecimal value);//减法 ... -
BigDecimal(double)存在精度损失风险
2020-08-10 16:34:49说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。 如: BigDecimal g = new BigDecimal(0.1f); 实际的存储值为:0.10000000149 正例:优先推荐入参为 String ... -
BigDecimal 转成 double
2015-08-11 14:37:00NUMBER(20,2) 数据库里的字段number ,实体是BigDecimal ...将BigDecimal转成double public double getOrderamount() { if (orderamount != null) { BigDecimal b2 = new BigDecimal(100); re... -
Java:利用BigDecimal类巧妙处理Double类型精度丢失
2020-12-29 09:44:43new BigDecimal(double val)new BigDecimal(String val)BigDecimal.valueOf(double val)Double的加减乘除运算工具类阿里巴巴Java开发手册关于BigDecimal的规定参考阅读 本篇要点 简单描述浮点数十进制转二进制精度... -
Double转换成BigDecimal进行运算
2019-10-18 17:51:46由于double进行加减乘除运算容易丢失精度,所以一般把double转换成BigDecimal进行调用BigDecimal的加减乘除方法进行运算之后在转成double类型 BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = ... -
BigDecimal 与double 转化失真
2019-06-27 10:32:001.BigDecimal(double val): 失真, 不要使用 BigDecimal(0.1)的值是: 0.1000000000000000055511151231257827021181583404541015625 因为准确的来说0.1本身不能算是一个double(其实0.1不能代表任何一个定长二... -
解决Java中BigDecimal类型使用Double构造方式精度丢失问题 贺兰的博客
2021-03-24 14:39:54解决Double类型在BigDecimal中精度丢失问题 最近在新公司遇到了一个bug,因为项目中涉及到了和金额相关的业务,所以就接触到了 BigDecimal 高精度类型,在处理BUG中遇到了... -
BigDecimal转换
2020-04-15 16:42:50代码检测爆出代码质量:使用浮点数进行精确计算 简单说就是不能用doule,不精确,要用BigDecimal ...BigDecimal num1=new BigDecimal("0.12"); 输出结果 add():相当于加 a.add(b)相当于a+b BigDecim... -
BigDecimal(String)与BigDecimal(double)的区别
2020-05-01 22:42:34要把double转化为BigDecimal,可以用BigDecimal的构造方法得到BigDecimal类型的值 BigDecimal构造函数有多种,其中2种常用的,把string和double作为构造器的参数,这2种有很大的区别 (1)BigDecimal(Stringval) ... -
double转bigDecimal精度问题
2018-11-28 14:30:54double转bigDecimal精度问题 需要用到bigDecimal的字符串构造来转 float的精度 : 2^23 7位 double的精度: 2^52 16位 十进制 转 二进制 存在精度差 double g= 12.35; BigDecimal bigG=new BigDecimal(g).setScale(1... -
BigDecimal转String,int,double及简单操作运算、方法
2018-07-09 13:49:59BigDecimal b = new BigDecimal(12.10);//BigDecimal 转换成 string数据类型 string c = b.toString();//BigDecimal 转换成 int...//BigDecimal 转换成 double数据类型 double c=a.doubleValue();b.stripTrail... -
Java中double转BigDecimal
2020-09-16 13:38:15BigDecimal(double val) -
BigDecimal操作double、float精度丢失问题
2019-07-03 09:35:52最近使用BigDecimal进行数值加减运算的时候踩了一个小坑:BigDecimal操作double、float数值时精度丢失。 举个例子: public static void main(String[] args) { float d1 = 1.2f; float d2 = 2.1f; BigDecimal ... -
BigDecimal 与 int,long,double之间的互转
2019-01-10 11:26:30BigDecimal 与 int,long,double之间的互转 转换关系如下: int 转换成 BigDecimal /** * int 转 Bigdecimal */ @Test public void demo04() { int a = 101; BigDecimal big = new BigDecimal(a); System....