信息发布软件,b2b软件,广告发布软件

标题: JavaScript加减乘除样样精通准确可以用它来计算各种算术难道了 [打印本页]

作者: 群发软件    时间: 2017-5-30 00:23
标题: JavaScript加减乘除样样精通准确可以用它来计算各种算术难道了
本帖最后由 群发软件 于 2017-5-30 00:30 编辑

[size=13.3333px]在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全
[size=13.3333px]
方法主要有三种
转换函数、强制类型转换、利用js变量弱类型转换。
1. 转换函数:
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。
一些示例如下:

复制代码 代码如下:

parseInt("1234blue"); //returns 1234
parseInt("0xA"); //returns 10
parseInt("22.5"); //returns 22
parseInt("blue"); //returns NaN

parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,示例如下:

复制代码 代码如下:

parseInt("AF", 16); //returns 175
parseInt("10", 2); //returns 2
parseInt("10", 8); //returns 8
parseInt("10", 10); //returns 10

如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:

复制代码 代码如下:

parseInt("010"); //returns 8
parseInt("010", 8); //returns 8
parseInt("010", 10); //returns 10

parseFloat()方法与parseInt()方法的处理方式相似。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,parseFloat()没有基模式。
下面是使用parseFloat()方法的示例:

复制代码 代码如下:

parseFloat("1234blue"); //returns 1234.0
parseFloat("0xA"); //returns NaN
parseFloat("22.5"); //returns 22.5
parseFloat("22.34.5"); //returns 22.34
parseFloat("0908"); //returns 908
parseFloat("blue"); //returns NaN

2. 强制类型转换
还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
可以用下面的代码段测试Boolean型的强制类型转换。

复制代码 代码如下:

Boolean(""); //false – empty string
Boolean("hi"); //true – non-empty string
Boolean(100); //true – non-zero number
Boolean(null); //false - null
Boolean(0); //false - zero
Boolean(new Object()); //true – object

Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。示例如下:

复制代码 代码如下:

用  法 结  果
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number( "5.5 ") 5.5
Number( "56 ") 56
Number( "5.6.7 ") NaN
Number(new Object()) NaN
Number(100) 100

最后一种强制类型转换方法String()是最简单的,示例如下:

复制代码 代码如下:

var s1 = String(null); //"null"
var oNull = null;
var s2 = oNull.toString(); //won't work, causes an error

3. 利用js变量弱类型转换
举个小例子,一看,就会明白了。

复制代码 代码如下:

<script>
var str= '012.345 ';
var x = str-0;
x = x*1;
</script>

上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串到数字的类型转换,不过这个方法还是不推荐的

 1、javascript具有下列种类的运算符:算术运算符;等同运算符与全同运算符;比较运算符;


  2、目的分类:字符串运算符;逻辑运算符;逐位运算符;赋值运算符;


  3、特殊运算符:条件运算符;typeof运算符;创建对象运算符new;delete运算符;void运算符号;逗号运算符;


  算术运算符:+ 、 - 、* 、 / 、 % 、 -(一元取反) 、 ++ 、 --

  等同运算符与全同运算符:== 、 ===、 !== 、 !===

  比较运算符:< 、 > 、 <= 、 >=

  字符串运算符::< 、 > 、 <= 、 >= 、 = 、 +

  逻辑运算符:&& 、 ||、 !、

  赋值运算符:=、 +=、 *=、 -=、 /=


  规则:


  一、一定要注意传递给运算符的数据类型和返回的数据类型!不同的运算符都期望它的运算数表达式计算出的结果符合某种数据类型。


  例如:对字符串是不能进行乘法运算的,"a" * "b" 是不合法的,但是,在可能的情况下,javascript会把表达式转换成正确的类型,因此,表达式 "3" * "5" 是合法的,javascript将字符串转换成数字执行运算,结果返回的是数字15,而不是字符串"15"。


  二、+ 根据运算数的不同,具有不同的表现:


  字符串 + 字符串 = 字符串(被连接);"a" + "b" = "ab" "5" + "6" = "11"

  字符串 + 数字 = (字符串转换成数字)字符串(被连接);"a" + 5 = "a5" 5被转换成字符串 "1" + 0 = "10"

  数字 + 数字 = 数字(相加)5 + 5 = 10。


  三、注意运算符的结合性,有些运算符从左到右的结合性;有些从右到左结合性。


  例如:w = a + b + c 等同于 w = (a + b) + c;

  w = ---b 等同于 w = - ( - ( -b ) ); w = a = b = c 等同于 w= ( a = ( b = c ))

  一元运算符、赋值运算符、三元运算符的结合性是从右到左的;


  四、算术运算符规则:


  “+”:可以进行“加法”与“连接”运算;如果2个运算符中的一个是字符串,javascript就将另一个转换成字符串,然后将2个运算数连接起来。

  “+”:如果一个运算数是对象,javascript就会将对象转换成数字做加法运算或者字符串做连接运算;

  “-”“*”“/” 如果2个运算数中的一个是是非数字,则将它转化成数字执行数学运算。

  “/” 在javascript中,由于所有的数都是浮点数,除法的结果都是浮点数,5 / 2 = 2.5 ;除数为0的结果为正负无穷;0/0为NaN;

  “%”模运算符:计算第一个运算数对第二个运算数的模,就是第一个运算数被第二个运算数除时,返回余数。如果运算数是非数字的,则转换成数字。

  “-”一元取反:将运算数取反,如果运算数不是数字,则转化成数字。

  “++”“--”增量运算符/减量运算符号:运算数必须是一个变量、树组的一个元素或对象的一个属性。如果运算数不是数字,则转换成数字。

  注意:如果“++”位于运算数之前,先对运算数进行增量,然后计算运算数增长后的值。

  如果“--”位于运算数之后,先计算运算数未增长之前的值,然后对运算数增量。

  例如:i = 1; //赋值给i值1

  j = ++i; //先将i增量为2,然后将2赋值给j,i的值是2,j的值也是2。

  i = 1; //赋值给i值1

  j = i++; //先将i赋值给j,然后对将i值增量到2,i的值是2,j的值是1。

  减量运算符“--”与“++”相同。


  五、等同运算符与全同运算符:


  (一)“==”“!==”等同运算符与非等同运算符:

  比较2个运算数,返回一个不布尔值。

  比较数值、字符串、布尔值使用的都是量值。当且仅当两个变量存放的值相等的时候,他们才相等。

  比较对象、数组、函数的时候,使用的是引用,只有2个变量引用的是同一个对象时,他们才是相等的

  。两个不同的数组是完全不同的,即使他们具有完全相同的元素。对于存放对象、数组、函数的引用的变量来

  说,只有当他们引用的是同一个对象、数组、函数的时候,他们才相等。


  注意!应遵循的原则:


  当两个运算数的类型不同时:将他们转换成相同的类型,

  1)一个数字与一个字符串,字符串转换成数字之后,进行比较。

  2)true转换为1、false转换为0,进行比较。

  3)一个对象、数组、函数 与 一个数字或字符串,对象、数组、函数转换为原始类型的值,然后进行比较。(先使用valueOf,如果不行就使用toString)

  4)其他类型的组合不星等。

  想两个运算数类型相同,或转换成相同类型后:

  1)2个字符串:同一位置上的字符相等,2个字符串就相同。

  2)2个数字:2个数字相同,就相同。如果一个是NaN,或两个都是NaN,则不相同。

  3)2个都是true,或者2个都是false,则想同。

  4)2个引用的是同一个对象、函数、数组,则他们相等,如果引用的不是同一个对象、函数、数组,则不相同,即使这2个对象、函数、数组可以转换成完全相等的原始值。

  5)2个null,或者2个都是未定义的,那么他们相等。

  “!=”非等同运算符:与等同运算符检测的结果相反。

  (二)“===”“!===”全同运算符与非全同运算符号:

  全同运算符遵循等同运算符的比较规则,但是它不对运算数进行类型转换,当两个运算数的类型不同时,返回false;只有当两个运算数的类型相同的时候,才遵循等同运算符的比较规则进行比较。

  “!==”非全同运算符与全同运算符比较的结果相反。如果两个运算数的类型或者值不同的时候,返回true。



  六、比较运算符:


  这些比较运算符用于比较不同类型的值,结果返回一个布尔值。

  “<”“>”“<=”“>=”

  注意规则:比较的运算数可以是任意类型的,但是只能在数字和运算数上执行。不是数字和字符串的运算数将被转换成数字或字符串。

  1)如果两个运算数都是数字,或者都可以转换成数字,则按照数字的大小进行比较;

  2)如果两个运算数都是字符串,或者都可以转换成字符串,则将按照字母顺序进行比较;

  3)如果字符串遇到数字,则将字符串转换成数字进行比较。

  4)如果运算数既不能转换成数字,也不能转换成字符串,则返回结果false。


  七、字符串运算符:


  并没有专用的字符串运算符,只是有些运算符在遇到字符串运算数的时候,表现不同。

  (一)“+”连接2个字符串;

  1)当2个运算数都是字符串的时候,连接起来;

  2)当其中有一个是数字的时候,将数字转换成字符串,连接起来;

  (二)“>”这样的比较运算符通过比较确认两个字符串的顺序,比较采用字符的顺序,较小的位于教大的前面,大写字母位于小写字母之前。

  (三)“+”的作用方法取决于计算顺序,

  如:s = 1 + 2 +"var" 则:返回结果3var; 因为先计算1+2,然后将结果3转换成字符串与"var"连接;

  如:s = "var" + 1 + 2 则:返回结果var12; 因为先计算var与1的连接,在将结果var1与转换成字符串的2连接起来。


  八、逻辑运算符:


  用于执行布尔运算,常常和比较运算符一起使用,来表示复杂的比较运算。

  “&&” 逻辑与运算、“||”逻辑或运算符、“!”逻辑非运算符

  (一)“&&”当两个运算数都是布尔值的时候,逻辑与对他们进行and操作,即:当且仅当两个布尔值都是true的时候,返回结果true,否则返回false。

  注意:实际表现

  “&&”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回false,则返回左边第一个运算数表达式的值:false;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;

  例如:if (a = b) stop(); 与 (a = b) && stop(); 等价

  不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,

  例如:if ((a < b) && (b++ <10) ) stop();如果运算符右边的增量必须的话,却有可能由于前面的返回值而不被执行,一般反对在&&的右边使用具有其他作用的表达式(赋值、函数调用、增减量);

  将“&&”看作是一个布尔代数的运算符,会更简单与安全。

  (二)“||”当两个运算数都是布尔值的时候,逻辑或对他们进行or操作,即:当两个布尔值有一个是true的时候,返回结果true,否则返回false。

  注意:实际表现

  “||”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回true,则返回左边第一个运算数表达式的值:true;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;

  同样不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,

  一般反对在||的右边使用具有其他作用的表达式(赋值、函数调用、增减量);

  将“||”看作是一个布尔代数的运算符,会更简单与安全。

  (三)“!”逻辑非是一个一元运算符,放在运算数之前,它的目的是对运算数取反。


  九、赋值运算符:


  (一)“=”是赋值运算符;他总是期望左边的运算数是一个变量、数组的一个元素或对象的一个属性;

  期望右边是一个任意类型的任意的值;

  从右到左的结合性,如果一个表达式中有多个赋值运算符,则从最右边开始计算。

  注意:每一个赋值表达式都有一个值,就是运算符右边的值;

  (二)可以使用带操作的赋值运算

  “+=” 左边的值加上右边的值后,赋值于左边的值。“-=”“/=”“*=”方法一样;


  十、其他运算符:


  “?:”条件运算符是唯一的一个三元运算符;

  一个表达式的布尔结果?表达式1(任意类型的任意值):表达式2(任意类型的任意值);

  根据第一个运算数的布尔值结果,如果为true,则执行第二个运算数表达式,返回第二个运算数表达式的值;如果第一个运算数的布尔值结果是false,则执行第三个运算数表达式,返回第三个运算数表达式的值。



问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。

我Google了一下,发现原来这是JavaScript浮点运算的一个bug。  比如:7*0.8 JavaScript算出来就是:5.6000000000000005 网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

程序代码 //除法函数,用来得到精确的除法结果

//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。

//调用:accDiv(arg1,arg2)

//返回值:arg1除以arg2的精确结果

function accDiv(arg1,arg2){

var t1=0,t2=0,r1,r2;

try{t1=arg1.toString().split(".")[1].length}catch(e){}

try{t2=arg2.toString().split(".")[1].length}catch(e){}

with(Math){ r1=Number(arg1.toString().replace(".",""))      

r2=Number(arg2.toString().replace(".","")) return (r1/r2)*pow(10,t2-t1); } }

//给Number类型增加一个div方法,调用起来更加方便。

Number.prototype.div = function (arg){

return accDiv(this, arg);

}

//乘法函数,用来得到精确的乘法结果

//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。

//调用:accMul(arg1,arg2)

//返回值:arg1乘以arg2的精确结果

function accMul(arg1,arg2) {

var m=0,s1=arg1.toString(),s2=arg2.toString();

try{m+=s1.split(".")[1].length}catch(e){}

try{m+=s2.split(".")[1].length}catch(e){}

return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m) }

//给Number类型增加一个mul方法,调用起来更加方便。

Number.prototype.mul = function (arg){  return accMul(arg, this); }

//加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。

//调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果

function accAdd(arg1,arg2){

var r1,r2,m;

try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}

try{r2=arg2.toString().split(".")[1].length}

catch(e){r2=0}

m=Math.pow(10,Math.max(r1,r2)) return (arg1*m+arg2*m)/m

}

//给Number类型增加一个add方法,调用起来更加方便。

Number.prototype.add = function (arg){

return accAdd(arg,this);

}

在你要用的地方包含这些函数,然后调用它来计算就可以了。 比如你要计算:7*0.8 ,则改成 (7).mul(8) 其它运算类似,就可以得到比较精确的结果。 ------------------------------------------------------------------------------------------------------------------------------------------------------------ 以上是在网上一个JS牛人的博客上转载的,不过上面只提及了加法、乘法和除法的解决办法。 这个时候可能很多人就会想,有了加法,减法还不容易?我就是差点让这个想法给害苦了。 其他的就不多说了, 帖出减法的代码:

function Subtr(arg1,arg2){     

var r1,r2,m,n;     

try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}     

try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}     

m=Math.pow(10,Math.max(r1,r2));     

//last modify by deeka     

//动态控制精度长度     

n=(r1>=r2)?r1:r2;     

return ((arg1*m-arg2*m)/m).toFixed(n); }



作者: kevin3898    时间: 2017-5-30 05:21
价了,还不错,就是看后期能不能一直有问必答。
作者: dfgdgdfgdf    时间: 2017-5-31 12:12
。值得好评
作者: asz111    时间: 2017-6-2 06:16
教程!!!!
作者: ctbvip    时间: 2017-6-3 04:04
是不错,是超级赞的,但后续的服务希一如以前。
作者: c19900420    时间: 2017-6-7 20:53
下次有需要在来
作者: huanyili998    时间: 2017-6-8 05:01
沟通问题已经解决,客服晨曦服务态度比较好。就是线上沟通,有些困难。希望可以尽快完善。合作愉快
作者: 脱颖而出    时间: 2017-6-14 03:54
别7号技术小哥服务很好!
作者: 武器    时间: 2017-6-15 05:59
话能买这么多模板挺好的。
作者: nidalma001    时间: 2017-6-22 16:42
好,与卖家描述的完全一致,非常满意
作者: daoke    时间: 2017-6-22 18:53
指导,模版装修的很漂亮。很满意。下次还会再来
作者: weipinzongmeng    时间: 2017-6-22 18:53
不错,店铺已经装修好了,店主很热心啊,还帮忙了不少呢!谢谢~!
作者: qingling520    时间: 2017-6-24 05:59
有耐心的客服,技术也很棒
作者: senbza    时间: 2017-6-28 10:19
技术亲58号~耐心讲解,用心制作,对于我们提的要求都可以完成,也少不了小笨蛋亲,077号亲,31号亲等帮忙。合作还在继续中~~感谢各位~~




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) Powered by Discuz! X3.2