读者须知:这块建立在你的数值在double范围内的,不然造成精度丢失,合理选择接收数据类型,如BigDecimal类型解决问题,这里只做double相关介绍。特别需要注意的是两个浮点数的算术运算
会有精度损失的,总之一句话,浮点数你要想精度不丢失一律用BigDecimal,且构造选用String的构造 Java NumberFormat格式化float类型的bug

java中double与Double的区别

double是基本数据类型,而Double实际上是一个包装类,内置有很多方法。

如果数据只是一个普通的浮点类型,两种都可以使用。有一个不一样的是Double可以返回null值。

        double money = 0.0d;
        double money1 = 0.0;
        double money2;
        //System.out.println(money2);//编译不通过,你必须的有默认值
        double money3;
        money2 = money;
        //money2 = money3;//编译不通过,你必须的有默认值
        Double mon;
        //System.out.println(mon);//编译不通过
        Double mon1;
        //mon1 = mon;// 编译不通过
        mon = null;
        mon1 = mon;
        mon = 0.0d;
        //Double a = 10;//编译不通过
        Double a1 = 10d;
        Double a1 = 10.0;
        //规范声明如下:然后再去赋值
        double truedouble = 0.0;
        Double trueDouble = null;

使用equals()检查两个对象的相等性。==检查2个引用是否引用内存中的同一对象。
内容检查仅对检查基元类型时的==可靠。对于对象类型,最好使用equals方法

double a = 1.0;
double b = 1.0;
Double c = 1.0;
Double d = 1.0;
System.out.println(a == b);  // true
System.out.println(c == d);  // false
System.out.println(c.equals(d));  // true

double是原始元素,因此其默认值将为0。 另一方面,Double变量是对象,因此其默认值将为null。

double是原始类型。 当用作数组中的元素时,如果没有其他默认值,则Java编译器将使用0.0。
Double是参考类型。 当您将其用作数组中的元素时,Java编译器将其初始化为一个对象,并且数组中每个对象的默认值为null。

double是一个类,double是一个原始类型
Double类将原始类型double的值包装在对象中。类型为Double的对象包含单个类型为double的字段。

在JDK1.5以后,二者可以直接相互赋值,称为自动拆箱和自动装箱。如果是这样,可以用Double中的方法,将包装类转为基本数据类型。
java中double与Double的互转

        double d = 10;
        Double D = new Double(d);

        Double a = 10.0;
        double v = a.doubleValue();

声明double变量的时候,加d与不加d有什么区别

默认情况下,赋值运算符右侧的实数被视为 double。 
但是,如果希望整数被视为 double,  请使用后缀 d 或 D

也就是说,对于小数来说 没有区别,默认就是double型的。
后面那个d一般用于整数的,比如:double v = 123d; 把123看成浮点数123.0

java中float与double的区别

在这里插入图片描述
更加深入了解请参考我这篇博文

java Double 详解

在这里插入图片描述

BigDecimal、Double、String之间的互转

这篇博文有对应方法,可搜索关键字快速锁定到对应内容

java将double型数据转化为String类型

这块说这个只要是把double弄成String后,在new BigDecimal(StringDouble)来进行一些需要精度计算的场合。

使用 String.valueOf() 方法
使用 Double.toString() 方法
		double number = 123.456;
 		String output1 = String.valueOf(number);
        String output2 = Double.toString(number);
        String output3 = number+"";

   /**
     * Double转BigDecimal
     *
     * @param v
     * @return
     */
    public static BigDecimal DoubleToBigDecimal(double v) {
        return new BigDecimal(Double.toString(v));
    }

    /**
     * Double转String
     *
     * @param v
     * @return
     */
    public static String DoubleToString(double v) {
        return Double.toString(v);
    }

将字符串转换为 double 类型的数值

String str = "56.7809";
double num = Double.parseDouble(str); 
// 如果字符串中包含非数值类型的字符,则程序执行将出现异常。

java double转String时消除使用科学计数

Double整数部分超7位用科学计数法表示
在这里插入图片描述

/**
     * 可将任意在自身类型范围内的数字无差别转为字符串
     * 这个只要你在对应类型范围内转成String跟之前数据类型数值一模一样
     * @param str
     * @return
     */
    public static String parseString(Object str){
        String returnValue = "";
        try {
            returnValue = new BigDecimal(String.valueOf(str)).toString();
            if(StringUtils.endsWith(returnValue, ".0")) {
                returnValue = StringUtils.removeEnd(returnValue, ".0");
            }
        } catch (Exception e) {
            returnValue = ObjectUtils.toString(str);
        }
        return returnValue;
    }

将double类型数据转换成long类型数据

将double类型数据转换成int类型数据

/**
 * 在转换时发生了精度丢失问题,转为int类型会把后面的小数点全部砍掉,
 * 不同数据类型转换过程中会有这个问题,原因是计算机是2进制的,针对这种情况的控制方法可以使用DecimalFormat来解决:
 * 具体需要保留几位可以通过DecimalFormat来进行设置。但是这块还会四舍五入掉,根据需求合理选用哦
 */

        double doubleValue = 82.94; // 82.14
        int intValue = (int) doubleValue; // 82
        //它将截断小数点后的值。它不会四舍五入,如果需要四舍五入,你就先给他四舍五入后在转成int
        System.out.println("intValue: "+intValue);

        Double aDouble = new Double(doubleValue);
        System.out.println(aDouble.intValue());

        Double a = 2.3 * 100;
        int i = new Double(a).intValue();
        System.out.println(i);//229
        System.out.println(new DecimalFormat("0").format(a));//230
    }

java中double型数据如何设置舍入策略

这一块核心思想,把double转String,然后去用BigDecimal的7种舍入策略即可,BigDecimal的舍入策略参看我这篇博文

比较两个指定的 double值

在Java中int类型数据的大小比较可以使用双等号,double类型则不能使用双等号来比较大小,如果使用的话得到的结果可能不相等,即使两者的精度是相同的也不可以。
Java中double类型大小比较的五种方法
我这里给出我认为好的规范的方法:
核心思想是使用BigDecimal的compareTo
为了防止精度损失,①把double转String, ②String转BigDecimal
为了方便我下面直接写好方法,直接传参笔记即可。
在这里插入图片描述

    public static int compareToSize(String num1, String num2) {
        BigDecimal bdL = new BigDecimal(num1);
        BigDecimal bdR = new BigDecimal(num2);
        return bdL.compareTo(bdR);
    }

    public static int compareToSize(double num1, double num2) {
        String s1 = Double.toString(num1);
        String s2 = Double.toString(num2);
        return compareToSize(s1,s2);
    }

double值取反

这块简单做法是*(-1),但是不知道会不会造成精度损失

		 double a = -0.23;
		 double v = a * (-1);

保险做法就是还是前面说的,转String 转成BigDecimal来*(-1) 或者人家BigDecimal有个取反的方法negate()

        BigDecimal bigDecimal = new BigDecimal("-0.23");
        BigDecimal negate = bigDecimal.negate();

double值取绝对值

     double abs = Math.abs(-0.236666666666666);

double格式化千位分割符

在这里插入图片描述

    /**
     * 格式化成千分位分割字符串
     * 保留两位小数(保留规则是6入,5后是0舍非零入)
     * 如果特殊需求加上¥或$     "$###,###.###"
     * @param v
     * @return
     */
    public static String toStringWithTwo(double v) {
//        DecimalFormat format = new DecimalFormat("###,###.##");//保留两位遇0舍
        DecimalFormat format = new DecimalFormat("###,###.00");//保留2位不足位数补0
        return format.format(v);
    }

double任意格式化

参考这篇博文,搜索:DecimalFormat数字格式方法总结

Double 类的常用常量

MAX_VALUE:值为 1.8E308 的常量,它表示 double 类型的最大正有限值的常量。
MIN_VALUE:值为 4.9E-324 的常量,它表示 double 类型数据能够保持的最小正非零值的常量。
NaN:保存 double 类型的非数字值的常量。
NEGATIVE_INFINITY:保持 double 类型的负无穷大的常量。
POSITIVE_INFINITY:保持 double 类型的正无穷大的常量。
SIZE:用秦以二进制补码形式表示 double 值的比特位数。
TYPE:表示基本类型 double 的 Class 实例。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐