读者须知:这块建立在你的数值在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 实例。