标题
- java中double与Double的区别
- 声明double变量的时候,加d与不加d有什么区别
- java中float与double的区别
- java Double 详解
- BigDecimal、Double、String之间的互转
- java将double型数据转化为String类型
- java double转String时消除使用科学计数
- 将double类型数据转换成long类型数据
- 将double类型数据转换成int类型数据
- java中double型数据如何设置舍入策略
- 比较两个指定的 double值
- double值取反
- double值取绝对值
- double格式化千位分割符
- double任意格式化
- Double 类的常用常量
读者须知:这块建立在你的数值在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);// 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
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.14int intValue = (int) doubleValue; // 82//它将截断小数点后的值。它不会四舍五入,如果需要四舍五入,你就先给他四舍五入后在转成intSystem.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);//229System.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位不足位数补0return 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 实例。