类型转换、精度损失、字串连接操作

Java中的类型转换:
Java8大基本数据类型 1,四种整数类型(byte、short、int、long): byte:8 位,用于表示最小数据单位,如文件中数据,-128~127 short:16 位,很少用,-32768 ~ 32767 int:32 位、最常用,-2^31-1~2^31  (21 亿) 2,两种浮点数类型(float、double): float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。 double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾。 3,一种字符类型(char):  char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0~2^16-1(65535)。 

   字节数少的到字节输多的转化不会造成精度损失

TestDouble.java的输出结果为:

 

 

 这样的结果是由于浮点数计算有缺陷而造成,

我们知道计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。

而N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4 = 1×102+2×101+3×100+4×10(-1);其它进制的也是同理,例如二进制数11.01 = 1×21+1×20+0+1×2(-2) = 十进制的3.25。

Double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。

。但可以采用引用bigdecimal类来避免这样的精度损失!

package java20190918;
import java.math.BigDecimal;

public class TestDouble {
	 private   static   final   int   DEF_DIV_SCALE   =   10;   
	 public   static   double   add(double   v1,double   v2){   
         BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));   
         BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));   
         return   b1.add(b2).doubleValue();   
 } 
	 public   static   double   sub(double   v1,double   v2){   
         BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));   
         BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));   
         return   b1.subtract(b2).doubleValue();   
 }     
	 public   static   double   mul(double   v1,double   v2){   
         BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));   
         BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));   
         return   b1.multiply(b2).doubleValue();   
 }   
	 public   static   double   div(double   v1,double   v2,int   scale){   
         if(scale<0){   
                 throw   new   IllegalArgumentException(   
                         "The   scale   must   be   a   positive   integer   or   zero");   
         }   
         BigDecimal   b1   =   new   BigDecimal(Double.toString(v1));   
         BigDecimal   b2   =   new   BigDecimal(Double.toString(v2));   
         return   b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
 }   
    public static void main(String args[]) {     
          System.out.println("0.05+0.01="+add(0.05,0.01));
          System.out.println("1.0-0.42="+sub(1.0,0.42));
          System.out.println("4.015*100="+mul(4.015,100));
    	  System.out.println("123.3/100="+div(123.3,100,3));
    }
}

  以上是我查阅资料所编写避免丢失精度的方法。

在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题的原因是double不能表示为任何有限长度的二进制小数;

字串联接操作:

输出结果为:

 

100200是因为他们各自输出X、Y的值而造成的。

300=X+Y则是因为双引号位置加错造成的。

 

posted @ 2019-09-18 17:03  doublebest1  阅读(424)  评论(0编辑  收藏  举报