精华内容
下载资源
问答
  • 2020-06-27 19:31:11

    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();
    
    更多相关内容
  • 对于不需要任何准确计算精度的数字可以直接使用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 BigDecimaldouble

    2019-07-18 16:33:27
    对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。 表11-15 ...

    BigDecimal类

    对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。

    表11-15 BigDecimal类的常用方法

    序号方 法类型描 述
    1public BigDecimal(double val)构造将double表示形式转换为BigDecimal
    2public BigDecimal(int val)构造将int表示形式转换为BigDecimal
    3public BigDecimal(String val)构造将字符串表示形式转换为BigDecimal
    4public BigDecimal add(BigDecimal augend)普通加法
    5public BigDecimal subtract(BigDecimalsubtrahend)普通减法
    6public BigDecimal multiply(BigDecimalmultiplicand)普通乘法
    7public BigDecimal divide(BigDecimaldivisor)普通除法

    范例:进行四舍五入的四则运算

    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转换double
    BigDecimal a = new BigDecimal(1000);
    return a.doubleValue();

    double转换BigDecimal
    BigDecimal d1TobigDe = new BigDecimal(v1);

    转载地址:https://www.cnblogs.com/mingforyou/p/3344489.html

    展开全文
  • BigDecimaldoubleValue()方法 (BigDecimal Class doubleValue() method) doubleValue() method is available in java.math package. doubleValue()方法在java.math包中可用。 doubleValue() method is used to ...

    BigDecimal类doubleValue()方法 (BigDecimal Class doubleValue() method)

    • doubleValue() method is available in java.math package.

      doubleValue()方法在java.math包中可用。

    • doubleValue() method is used to convert a BigDecimal to a double value and when this BigDecimal magnitude is not in a range of double so it will be changed to Double.POSITIVE_INFINITY or Double.NEGATIVE_INFINITY.

      doubleValue()方法用于将BigDecimal转换为双精度值,并且当此BigDecimal幅度不在double范围内时,它将被更改为Double.POSITIVE_INFINITY或Double.NEGATIVE_INFINITY。

    • doubleValue() method is a non-static method, it is accessible with the class object only and if we try to access the method with the class name then we will get an error.

      doubleValue()方法是一种非静态方法,只能通过类对象访问,如果尝试使用类名称访问该方法,则会收到错误消息。

    • doubleValue() method does not throw an exception at the time of converting BigDecimal to a double.

      将BigDecimal转换为double时, doubleValue()方法不会引发异常。

    Syntax:

    句法:

        public double doubleValue();
    
    

    Parameter(s):

    参数:

    • It does not accept any parameter.

      它不接受任何参数。

    Return value:

    返回值:

    The return type of this method is double, it returns the double representation of this BigDecimal.

    此方法的返回类型为double ,它返回此BigDecimal的double表示形式。

    Example:

    例:

    // Java program to demonstrate the example 
    // of double doubleValue() 
    // method of BigDecimal
    
    import java.math.*;
    
    public class DoubleValueOfBD {
        public static void main(String args[]) {
            // Initialize two variables of int and 
            // String type
            int val = 125;
            String str = "100";
    
            // Initialize two BigDecimal objects  
            BigDecimal b_dec1 = new BigDecimal(val);
            BigDecimal b_dec2 = new BigDecimal(str);
    
            // By using doubleValue() method is to 
            // convert this BigDecimal (b_dec1) into
            // a double, variable named d_conv
            double d_conv = b_dec1.doubleValue();
            System.out.println("b_dec1.doubleValue(): " + d_conv);
    
            // By using doubleValue() method is to 
            // convert this BigDecimal (b_dec2) into
            // a double, variable named d_conv
            d_conv = b_dec2.doubleValue();
            System.out.println("b_dec2.doubleValue(): " + d_conv);
        }
    }
    
    

    Output

    输出量

    b_dec1.doubleValue(): 125.0
    b_dec2.doubleValue(): 100.0
    
    
    

    翻译自: https://www.includehelp.com/java/bigdecimal-doublevalue-method-with-example.aspx

    展开全文
  • 今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换BigDecimal时,有效数字改变了,如下: public class BigDecimalTest { public static void main(String[] arg) { String s1 = "123....
  • BigDecimalDouble转换

    2017-06-22 16:44:45
    BigDecimalDouble转换
  • BigDecimal类对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示...
  • JavadoubleBigDecimal

    千次阅读 2020-08-24 10:55:34
    BigDecimal(double):创建一个具有参数所指定双精度值的对象 BigDecimal(long):创建一个具有参数所指定长整数值的对象 BigDecimal(String):创建一个具有参数所指定以字符串表示的数值的对象 2、使用注意 (1) 案例...
  • JavaDoubleBigDecimal的相互转换

    千次阅读 2021-03-08 07:10:15
    今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换BigDecimal时,有效数字改变了,如下:public class BigDecimalTest {public static void main(String[] arg) {String s1 = "123.45";...
  • JavadoubleBigDecimal的注意事项

    万次阅读 多人点赞 2018-08-10 16:01:20
    先上结论:不要直接用double变量作为构造BigDecimal的参数。   线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3。 2,解析JSON并把这个数字保存在一个float变量。 3,把这个float...
  • JAVA BigDecimal运算以及转换

    万次阅读 2020-08-03 11:07:19
    Javajava.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于...
  • 有方法 java.math.BigDecimal.doubleValue() BigDecimal a = new BigDecimal(1000); return a.doubleValue(); public static void printDoubleToBigDecimal(double v1, double v2){ BigDecimal d1TobigDe...
  • JavadoubleBigDecimal

    2020-09-16 13:37:07
    BigDecimal(double val)
  • Java BigDecimal详解--double 精度计算

    千次阅读 2018-08-22 22:05:53
    Java BigDecimal详解   1.引言  float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有...
  • Java BigDecimal详解

    2021-04-22 00:36:29
    1.引言借用《EffactiveJava》这本书中的话,float 和 double 类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们...
  • 不能直接使用Bigdecimal的构造函数传double进行转换,部分数值会丢失精度,因为计算机是二进制的Double无法精确的储存一些小数位,0.1的double数据存储的值实际上并不真的等于0.1 如该方式将0.1转换Bigdecimal得到...
  • 使用new BigDecimal(double val)对doubel进行转换会导致转换后精度丢失 原因 BigDecimal的构造函数public BigDecimal(double val)会损失了double 参数的精度。jdk中已经明确不建议使用new BigDecimal(double value)...
  • java BigDecimal比较大小

    2022-05-04 16:05:48
    BigDecimal比较大小 以及 和double对比 性能比较
  • 有方法 java.math.BigDecimal.doubleValue()BigDecimal a = new BigDecimal(1000); return a.doubleValue();
  • 使用BigDecimal解决double类型数据运算的精度问题
  • 当我们在开发的时候,有时候根据需求来讲,会要求小数点后精确到几位数,例如涉及到费用的问题,通常会让我们精确到小数点后4位,就类似于“0.3333”的格式,...我们来看看JDK1.8中对BigDecimal对象是如何解释他的构...
  • BigDecimal类型和double类型的值相互转换 1.BigDecimaldouble,使用BigDecimal类里面doubleValue()方法: BigDecimal latitude = 39.97268600; double latitudeDou = latitude.doubleValue() 2.double转...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,751
精华内容 11,100
关键字:

java bigdecimal double转换

java 订阅