1. Java中较长的long类型的变量(值大于int能够描述的最大数字)强制转换为int后,
值将先将long类型的“大数”转化为二进制,然后由低位到高位截取32位二进制数,再将这32位二进制数转化为int类型的“小数”。
同时注意,定义long型时,long a=213L;(注意最后的L)
2.字符串和数字相加问题
public class Test{
public static void main(String[] args){
long[] a1={1,2,4};
System.out.print(a1[0] + a1[1] +a1[2] +" ");
System.out.println(" " + a1[0] +a1[1] +a1[2]);
}
}
相当于:
System.out.print(new Long(a1[0] + a1[1] + a1[2]).toString() +" ");
System.out.println(" "+new Long(a1[0]).toString() +new Long(a1[1]).toString()+new Long(a1[2]).toString() );
原因是如果你的数组是整形数据,也就是可以使用+做加法,而对于“”的转换,就是转换成一种字符串,字符串中的+是连接字符串的作用,明白了这个后,你就要看看你的运算是先做加法还是先转换为字符串,像(1)中的,你看看它是先做整形数字的加法,最后在强制转换为字符串,“”的作用其实跟toString()作用一样,(2)中的是先强制转换为字符串,这样连后面的整形也被强制装换为字符串类型了,+在字符串中只能做连接字符!
3.问题:
public class HelloWorld {
public static void main(String[] args) {
// TODO Auto-generated method stub
double a=456.68d;
int b=123;
System.out.println("c="+(a+b));
System.out.println("The result="+(123+456.58+"I`m lucky"));
}
}
结果:
c=579.6800000000001
The result=579.5799999999999I`m lucky
问题在于小数点后位数太多,不是确切的数。
这是double类型的缺点。这种运算时候需要使用
BigDecimal b1 = new BigDecimal(Double.toString(v1));
这个会让小数不出差错~
在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
1、用float或者double变量构建BigDecimal对象。
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
3、把BigDecimal对象转换成float,double,int等类型。
进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。
下面是一个工具类,该工具类提供加,减,乘,除运算。
public class Arith {
/**
* 提供精确加法计算的add方法
* @param value1 被加数
* @param value2 加数
* @return 两个参数的和
*/
public static double add(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确减法运算的sub方法
* @param value1 被减数
* @param value2 减数
* @return 两个参数的差
*/
public static double sub(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确乘法运算的mul方法
* @param value1 被乘数
* @param value2 乘数
* @return 两个参数的积
*/
public static double mul(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供精确的除法运算方法div
* @param value1 被除数
* @param value2 除数
* @param scale 精确范围
* @return 两个参数的商
* @throws IllegalAccessException
*/
public static double div(double value1,double value2,int scale) throws IllegalAccessException{
//如果精确范围小于0,抛出异常信息
if(scale<0){
throw new IllegalAccessException("精确度不能小于0");
}
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.divide(b2, scale).doubleValue();
}
}
参考资料:http://blog.csdn.net/jackiehff/article/details/8582449