读者须知:这块建立在你的数值在double范围内的,不然造成精度丢失,合理选择接收数据类型,如BigDecimal类型解决问题,这里只做double相关介绍。特别需要注意的是两个浮点数的算术运算
会有精度损失的,总之一句话,浮点数你要想精度不丢失一律用BigDecimal,且构造选用String的构造 Java NumberFormat格式化float类型的bug
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); // trueSystem.out.println(c == d); // falseSystem.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
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+"";
public static BigDecimal DoubleToBigDecimal(double v) { return new BigDecimal(Double.toString(v)); } 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位用科学计数法表示
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类型数据
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格式化千位分割符
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 实例。
来源地址:https://blog.csdn.net/liu918458630/article/details/127361899