变量和简单数据类型(化浮为整)

 变量和简单数据类型

简单数据类型,分为字符串、数值型、布尔型、null和undefined 

变量需要用关键字var定义,它的作用就是保存这些值

字符串就是一些文本,通过操作符 “+” 可以对字符串进行连接 

var str01 = "我的名字是:";
var str02 = "叶小凡";
alert(str01 + str02 );

 数值型:数字分为整数和小数 都可以呀ongoing变量装起来

布尔型:分为true和false  

用if语句判断,if("叶小凡"){ alert(‘真’);} else { alert(" 假" ); }    ==>运行结果为  真

不为空的字符串自然是真,如果字符串是空的即 if 里面为空,结果为 假 

数值型分正数、负数和0  

if( 10 ){ alert(‘真’);} else { alert(" 假" ); }    ==>运行结果为  真

if( -10 ){ alert(‘真’);} else { alert(" 假" ); }    ==>运行结果为  真

if( 0 ){ alert(‘真’);} else { alert(" 假" ); }    ==>运行结果为  假

字符串只要不为空,就表示真,否则就是假。

数字只要不为0,就代表真,否则就是假。

null 和 undefined 都是代表空值  

null 是主动地将某个变量设置为空值

undefined 更多的是因为对于一些意外状况而出现( 定义了一个变量,但是没有给他赋值,所以他的值就是undefined )

真假判断,null和undefined都是空值,自然代表了假 

化浮为整

计算0.1 + 0.2  

var num01= 0.1 ;

var num02= 0.2;

alert ( num01 + num02);           ==> 结果为 0.30000000000000004

( 精度丢失问题)

小数计算丢失精度,整数计算没有这个问题

var num01= 0.1 ;

var num02= 0.2;

num01 = num01 * 10;

num02  = num02 * 10;

alert ( num01 + num02);   ==>结果为 3  

alert(num01 + num02 )/ 10);   ==> 结果0.3

如果不是0.1+0.2  , 0.1和0.01 呢   小数点后面的位数!

0.01就是小数,也是浮点数,化浮为整就要 X100      ( 100 是因为小数点后面有两位)

获取小数点后面的位数! 把数字当成字符串处理!  因为字符串有一个length属性  

var num01 = "0.01";

alert (num01.length);   结果是4,表示0.01这个字符串有4位

字符串有个splice函数,把字符串通过某者规则和标记符号进行分隔,并返回一个数组

( splice方法是插入、删除或者替换数组元素,不仅在原有数组修改,还返回被处理的内容。

splice方法用前两个参数进行定位,余下的参数表示插入 )

0.01如果通过 " . ( 点) " 来分隔 就会返回一个字符串数组  整个字符串数组里面应该有两个字符串,一个是0 一个是01

var num01 = " 0.01 ";

var num01_arr = num01.split(".");

经过点号分隔,0.01被拆开了  变成了字符串数组[ 0,01 ]  其中想要获得01,又因为数组下标是从0开始,所以需要这样获取:

var num01 = "0.01";

var num01_arr = "num01.split(".");

var num01_arr_2 = num01_arr[1];

alert ( num01_arr_2.length);

最后结果为 2 

获取到了0.01小数点后面的位数(小数点后两位),两位对应倍数100

计算0.1+0.2 需要先把两个数中比较小的那个数字通过上面这个方法求出倍数,然后把这两个数都乘以这个倍数,就可以化浮为整了。(整数计算没有精度丢失问题,计算出结果后除以倍数就得到正确答案了!)

函数:返回值、参数列表和函数体

(将函数想象成黑盒子,参数就是黑盒子里的物体<可以是单个的也可以是多个物体> 黑盒子内部空间就是函数的函数体,在函数体中,对参数进行处理,处理结束后,该函数设计者需要得到某个结果从黑盒子中扔出,就可以使用return关键字将其抛出)

业务逻辑:必须清楚地明白自己设计这个函数是为了什么。( 为了解决什么问题)

例:0.1+0.2 小数相加会有精度丢失问题 => 为了解决这个问题 先把0.1和0.2变成整数进行计算,最后再除以一个倍数10。对于小数计算,可以设计一个通用的函数,将需要相加的参数传递进去,将化浮为整的逻辑就写在函数体中,最后将结果返回

function add(num1,num2){
   // 将数字转换成字符串
   num1 = num1.toString();
   num2 = num2.toString();
   // 获取两个数字的小数点后面位数
   var a = num1.split(".")[1].length;
   var b = num2.split(".")[1].length;
   //用console.log查看倍数
   console.log(a);
   console.log(b);

函数的调用:调用一个函数就只需要在函数名称右边打一对小括号就可以。如果函数有一个参数,那么就在小括号里填入具体数据,比如变量或者直接量。如果函数有多个参数,就在圆括号填入多个具体数据,用逗号分隔。例:var num1 = 10; var num2 = 20; add(num1,num2);

比如:传进来0.2  0.02 

// 获取两个数字的小数点后面的位数
var a = num1.split(".")[1].length;
var b = num2.split(".")[1].length;

计算得出位数:a = 1   b=2 

( 需要把0.2  0.02同时乘100  变成20 和 2 ,然后计算20+2 =22 ,最后除以100得到0.22 )

var max = a;   //先默认较大的位数为a
if ( a<b ){    //如果a比b小,就把b 赋值给max(最大值)
    max = b ;
} 
//根据位数获得对应的10的幂数
//两个小数同时乘以倍数
//相加完毕后,再将结果除以倍数

max就是较大的位数,如果 max = 2  那么2就变成100 ( 也就是10 X 10 ) 

max是3就是10*10*10    4=>10*10*10*10  ······

//根据位数获取对应的10的幂数
var beishu = 1;
for (var i= 0;i<max;i++){
beishu = beishu * 10;
}

如果传入的是0.2  0.02 那么max就是2,for就循环两次,每次倍数都扩大10倍,两次扩大100

// 两个小数同时乘得到的这个倍数
num1 = num1 * beishu;
num2 = num2 * beishu;

0.2*100 = 20         0.02*100 = 2    => 20 + 2 = 22  

最后相加以后再除以倍数,把结果返回出去

// 相加完后,将结果除以倍数!
var sum = ( num1 + num2 ) / beishu;
return sum;

22 / 100 = 0.22

最后调用函数来算最开始的值: alert(add(0.1,0.2))  => 结果为0.3

如果在该代码中,测试1和0.2   cannot read property ' length' of undefined

只要是字符串就会有length属性     length属性代表了一个字符串的长度

var a = num1.split(".")[1].length;中 num1.split(".")[1] 这句代码的意思是将变量num1根据“.”进行分隔。这个时候num1的值为1,本来就没 有点号。也就是说,给字符串“1”根据“.”分隔,那么只会得到一个 只有单个数据的数组:[“1”]。又因为数组的下标是从0开始的,所以 [1]代表从数组的第2个位置获取数据。可是num1.split(".")得到的 数组只有一个元素,换句话说,只有下标为0的位置里才有数据,因此,强行去[1]的地方获取数据自然是 不可行的,自然就会报错

传入数字后,先判断是不是小数,如果是就继续之前的方法 ,如果不是小数就默认为小数位是0

只要是字符串 就会有index O放方法  => 利用字符串 indexOf 方法

indexOf 方法 : 是在原字符串中搜索一个特定的字符串,

比如说从“ 123456” 搜索2 ,字符串的下标从0开始,所以找到2的时候,返回结果为1 

如果查询的内容在字符串中不存在:

 查询一个不存在的匹配项,得到的结果就是 -1 

利用indexOf 方法  查询 “ . ” 得到一个返回值,只要返回值不是-1 就代表是有小数点,说明这个数是小数 

 replace 方法

先将小数的 “  . ( 点 )” 去掉 

2.2就变成22;1.001变成1001  为了保证位数的一致,

1.001比2.2小数位数多了两位,所以要在22后面补零,变成2200 

如果是去除小数点,就用replace," abcd " 里面内容替换成大写C  就变成了" abCd"

则 "abcd".repalce("c","C")

这次将传入的两个参数num1  num2 用toString 方法写成字符串  

用index获取小数点位置( 如果其中一个是整数那么index获取的就是-1 ,等于-1时不存在,小数位就是0 ,如果不是-1  那么就通过字符串截取函数splice获取小数点的位数)


function add (num1,num2){
   // 将数字转换成字符串
   num1 = num1.toString();
   num2 = num2.toString();

    // 获取小数点的位置
   var index1 = num1.indexOf(".");
   var index2 = num2.indexOf(".");

   // 如果小数点存在,那么就再获取各自的小数位数
   var ws1 = 0 ;
   var ws2 = 0;
   if ( index1 ! =-1){
        ws1 = num1.split(".")[1].length;
    }
   if ( index2 != -1 ){
        ws2 = num2.split(".")[1].length;
    }
    
    // 看谁的小数位数大,谁的小数位数小 
     var bigger = (ws1>ws2) ? ws1 : ws2 ;
     var smaller = (ws1<ws2) ? ws1 : ws2 ;
  
    // 计算得到需要补齐的0的个数,大的位数减去小的
     var  zerosCount = bigger - smaller;

     //( 不管两个数谁大谁小 )全部去除小数点
     num1 = num1.replace(".","");
     num2 = num2.replace(".","");

     // 比较num1和num2谁大,比较方法就是看谁是smaller,是smaller的一方就补0
     if(ws1 == small){
           for(var i = 0 ;i<zerosCount;i++){
              num1 += "0";
           }
      }else{
           for(var i = 0 ;i<zerosCount;i++){
              num2 += "0";
           }
       }

      // 开始计算
       var sum = parseInt(num1) + parseInet(num2);

      //根据较大的小数位数计算倍数
        var beishu = 1;
        for(var i = 0; i<bigger;i++){
             beishu = beishu * 10;
        }
         sum = sum / beishu;
          return sum;
        }  

        // 弹窗显示alert
        alert(add(1.001,2.002));
     
}

先将两个数字转换成字符串(toString)

获取各自小数位,如果是整数没有小数位那么就是0 

接下来去掉小数点  replace  ==> "1.01".replace("."," ")   这样得到的就是101  

如果另一个数是整数2,那么为了保证位数一直,就需要再整数后面添0 ,添的和小数位数一样多

那么两个0就是2和1.01位数差,要拿到2和1.01小数位数,利用字符串截取的办法

获取1.01小数后面使用splice函数和length属性  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值