A-A+
JavaScript浮点数的运算详细介绍
在JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的64bit浮点格式存储number,按照IEEE 754的定义: decimal64对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。
类似地,我们可以想像,1/3的结果应该是0.3333333333333333。
为了得到我们想要的结果,我们需要校正这个值.
js中通过parseFloat函数可以把字符串转换成浮点数. 如果要把字符串转换成整数我们可以使用parseInt 函数. 通过parseFloat只能把数字字符转换成浮点数,不能把字母字符转换成浮点数。
parseFloat 函数的最主要的用途就是把用户从文本框输入的字符串转换成浮点数。
下面我们通过一个范例演示一下parseFloat函数的用法,我们放置两个文本框,让用户输入两个数字,然后计算其和并显示在第三个文本框内,代码如下:
- <html>
- <head>
- <title>脚本分</title>
- <script type="text/javascript">
- function to_add(){
- document.f1.t3.value=parseFloat(document.f1.t1.value) + parseFloat(document.f1.t2.value);
- }
- </script>
- </head>
- <body>
- <form method=post name=f1 ><br>
- Enter fist value<input type=text name=t1 onBlur="to_add();"><br>
- Enter Second value<input type=text name=t2 onBlur="to_add();"><br>
- Sum <input type=text name=t3>
- </form>
- </body>
- </html>
注:parseFloat函数会尽量帮你把字符串转换成函数,比如查看源代码print,代码如下:
1 document.write(parseFloat("1234abc45"));
输出:1234
也就是说parseFloat函数会从字符串开始位置进行数字转换,碰到非数字字符停止,而"abc123",这样的字符串是无法转换成功的,上面这些都不是我们想要的结果,下面来看一个函数来解决这个问题,代码如下:
- //除法函数,用来得到精确的除法结果
- //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
- //调用:division(arg1,arg2)
- //返回值:arg1除以arg2的精确结果
- function division(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);
- }
- }
- //乘法函数,用来得到精确的乘法结果
- //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
- //调用:multiply(arg1,arg2)
- //返回值:arg1乘以arg2的精确结果
- function multiply(arg1,arg2){
- arg1=String(arg1);var i=arg1.length-arg1.indexOf(".")-1;i=(i>=arg1.length)?0:i;
- arg2=String(arg2);var j=arg2.length-arg2.indexOf(".")-1;j=(j>=arg2.length)?0:j;
- return arg1.replace(".","")*arg2.replace(".","")/Math.pow(10,i+j);
- }
- //加法函数,用来得到精确的加法结果
- //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
- //调用:add(arg1,arg2)
- //返回值:arg1加上arg2的精确结果
- function add(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;
- }