zoukankan      html  css  js  c++  java
  • 类型转换、精度损失、字串连接操作

    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则是因为双引号位置加错造成的。

  • 相关阅读:
    【linux就该这么学】-05
    【linux就该这么学】-04
    【linux就该这么学】-03
    【linux就该这么学】-02
    【linux就该这么学】-01
    【linux就该这么学】-00
    MySQL57安装与设置
    Docker(一) Docker入门教程
    Centos 7.X 安装及常规设置
    删除数组里所有与给定值相同的值
  • 原文地址:https://www.cnblogs.com/yangxionghao/p/11543679.html
Copyright © 2011-2022 走看看