精华内容
下载资源
问答
  • BigDecimal转double转换遇到的问题
    千次阅读
    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);
    }
    一个很好用的方法

    更多相关内容
  • 对于不需要任何准确计算精度的数字可以直接使用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)。
    展开全文
  • BigDecimal大据类。 浮点型运算的时候直接 加减乘除时可能会出现数据失真(精度问题)。 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.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();





    1.  public static void printDoubleToBigDecimal(double v1, double v2){  
    2.         BigDecimal d1TobigDe = new BigDecimal(v1);  
    3.         BigDecimal d2TobigDe = new BigDecimal(v2);  
    4.         System.out.println("d1TobigDe="+d1TobigDe);  
    5.         System.out.println("d2TobigDe="+d2TobigDe);  
    6.     } 

    展开全文
  • String转BigDecimal转Double

    2020-09-01 22:27:42
    public static void main(String[] args) { String s = "123.94752719"; //String转BigDecimal BigDecimal big = new BigDecimal(s);... //BigDecimal转Double保留小数(几个0就是几位小数) Strin
  • 下面小编就为大家带来一篇java中double转化为BigDecimal精度缺失的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • BigDecimalDouble转换

    2017-06-22 16:44:45
    BigDecimalDouble转换
  • BigDecimal类型和double类型的值相互转换 1.BigDecimal转double,使用BigDecimal类里面doubleValue()...2.double转BigDecimal,使用BigDecimal类里面valueOf()方法: double latitudeDou = 39.97268600; BigDecimal lat
  • 相关知识: 小数的二进制表示和计算 BigDecimal的基础使用 构造器 BigDecimal(int) 创建一个具有参数所指定整数值的对象 BigDecimal(double) 创建一个具有参数所指定双精度值的对象 BigDecimal(long) 创建一个具有...
  • https://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...
  • 使用new BigDecimal(double val)对doubel进行转换会导致转换后精度丢失 原因 BigDecimal的构造函数public BigDecimal(double val)会损失了double 参数的精度。jdk中已经明确不建议使用new BigDecimal(double value)...
  • 记录学习Double转Bigdecimal丢失精度的原因 注意事项: 不能直接使用Bigdecimal的构造函数传double进行转换,部分数值会丢失精度,因为计算机是二进制的Double无法精确的储存一些小数位,0.1的double数据存储的值...
  • BigDecimal b = new BigDecimal(webResponse.getGmv()); webResponse.setGmv(b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
  • Java BigDecimaldouble

    千次阅读 2019-05-22 17:16:51
    Java BigDecimaldouble
  • 主要介绍了Java BigDecimaldouble示例及相关问题解析,简单介绍了BigDecimal类的相关内容,分享了两则相关实例,对问题进行了分析,具有一定参考价值,需要的朋友可以了解下。
  • Java中double转BigDecimal的注意事项

    万次阅读 多人点赞 2018-08-10 16:01:20
    先上结论:不要直接用double变量作为构造BigDecimal的参数。   线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3。 2,解析JSON并把这个数字保存在一个float变量。 3,把这个float...
  • BigDecimal使用及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:00
    NUMBER(20,2) 数据库里的字段number ,实体是BigDecimal ...将BigDecimal转double public double getOrderamount() { if (orderamount != null) { BigDecimal b2 = new BigDecimal(100); re...
  • new 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 = ...
  • 1.BigDecimal(double val): 失真, 不要使用 BigDecimal(0.1)的值是: 0.1000000000000000055511151231257827021181583404541015625  因为准确的来说0.1本身不能算是一个double(其实0.1不能代表任何一个定长二...
  • 解决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...
  • 要把double转化为BigDecimal,可以用BigDecimal的构造方法得到BigDecimal类型的值 BigDecimal构造函数有多种,其中2种常用的,把string和double作为构造器的参数,这2种有很大的区别 (1)BigDecimal(Stringval) ...
  • double转bigDecimal精度问题

    千次阅读 2018-11-28 14:30:54
    double转bigDecimal精度问题 需要用到bigDecimal的字符串构造来转 float的精度 : 2^23 7位 double的精度: 2^52 16位 十进制 转 二进制 存在精度差 double g= 12.35; BigDecimal bigG=new BigDecimal(g).setScale(1...
  • BigDecimal 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:15
    BigDecimal(double val)
  • 最近使用BigDecimal进行数值加减运算的时候踩了一个小坑:BigDecimal操作double、float数值时精度丢失。 举个例子: public static void main(String[] args) { float d1 = 1.2f; float d2 = 2.1f; BigDecimal ...
  • BigDecimal 与 int,long,double之间的互 转换关系如下: int 转换成 BigDecimal /** * int Bigdecimal */ @Test public void demo04() { int a = 101; BigDecimal big = new BigDecimal(a); System....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,182
精华内容 21,272
关键字:

bigdecimal转double