js中小数运算(加、减、乘、除)的问题及一些数学函数
作者:cuicheng0826 日期:2011-3-10 15:15:48
http://www.chinaret.com/user/topic_view.aspx?id=264ba1a2-eef9-4236-be15-960aeac00db6

在上一篇计算耗时的文章中,在两个数相加相除遇到了一些小麻烦,在这里也一并解答一下:

var time=2.4/0.8;    没处理的结果是:2.99999999995 一个double类型
解决方案是:temp * 100 / (0.8 * 100) ;temp为一只有两位小数的变量,通过先将他们装换成整数在进行相除,就可以了,两个小数之间取模也是这种解决办法:temp * 100 % (0.8 * 100);

parseFloat(temp.toFixed(2).toString()); //取该变量小数点后两位小数,并将其转换成Float类型
Math.floor(temp); //仅仅取这个变量的整数部分 Math.floor(3.4444);=》3    Math.floor(3.9999);=》3

保留小数点后几位小数的方法
1、temp.toFixed(2);//取该变量小数点后两位小数

2、
xx=0.02018
如果是保留3位小數
alert(Math.round(parseFloat(xx)*1000)/1000)
四位
alert(Math.round(parseFloat(xx)*10000)/10000)   (JavaScript中round函数方法是返回与给出的数值表达式最接近的整数。使用方法: Math.round(number) ;其中number是要舍入到最接近整数的值。
number 的小数部分大于等于 0.5,返回值是大于 number 的最小整数。否则,round 返回小于等于 number 的最大整数。)

3、
<script language=JavaScript>
function tofloat(f,dec) {
if(dec<0) return "Error:dec<0!";
result=parseInt(f)+(dec==0?"":".");
f-=parseInt(f);
if(f==0)
for(i=0;i<dec;i++) result+=''0'';
else {
for(i=0;i<dec;i++) f*=10;
result+=parseInt(Math.round(f));
}
return result;
}
alert(tofloat(11.20000000000000000001,2))
</script>
注:
还有一些要说的是我们可以先将这些数转换成字符串类型,在通过split(以什么字符分割字符串成数组)方法,将字符串分割成数组,取数组下标;

两个小数相减:
javascript:document.write(11.3-10.1)   会显示1.200000000000001
解决方案:
javascript:document.write(paresFloat(11.3-10.1));
这个和数据结构有关系
整数型自动转换成正型计算
小数型直接转成double型计算
这是在内存中运算的时候必须这样
你该知道计算机只认识0和1吧
具体的就是浮点精准度的问题
float 精确到小数点后7位
double 精确到小数点后15位

在Javascript中,数学方法可以分成以下几类:
constans(常数)、power functions(乘方函数)、trigonometic functions(三角函数)、rounding functions(舍入函数)、random numbers(随机数字)

常数和乘方函数

Math.E 自然对数的底(为常数) 2.718
Math.LN10 10的自然对数 2.302
Math.LN2 2的自然对数 0.693
Math.PI 圆周率 3.1415
Math.SQRT1_2 1/2的平方根 0.707
Math.SQRT2 2的平方根 1.414
Math.sqrt(x) X的平方根 更X的值有关
Math.pow(x, n) 返回x的n次方的数值 参数为x和n
Math.log(n) 返回n的自然对数 参数为n
Math.exp(n) 返回e的n次方的数值 参数为n

三角函数

Math.cos(x) X的余弦函数
Math.sin(x) X的正弦函数
Math.tan(x) X的正切函数
Math.acos(y) X的反余弦函数
Math.asin(y) X的反正弦函数
Math.atan(y) X的反正切函数

这里注意:参数x和以及反函数的返回数值的单位都为弧度(比如 PI弧度=180度)

舍入函数和随机数字

Math.random() 产生从0到1的随机数
Math.round(x) 取最接近整数x的数值
Math.floor(x) 取最接近整数x并且比x小的数值
Math.ceil(x) 取最接近整数x并且比x大的数值
Math.min(a, b, c) 返回参数列表中最小的数值
Math.max(a, b, c) 返回参数列表中最大的数值  


Math.random()
返回 0 ~ 1 之间的随机数。
Math.round()
四舍五入取整。
Math.ceil()
返回值:返回大于或等于x,并且与之最接近的整数。
注:如果x是正数,则把小数“入”;如果x是负数,则把小数“舍”。
Math.floor()
返回值:返回小于或等于x,并且与之最接近的整数。
注:如果x是正数,则把小数“舍”;如果x是负数,则把小数“入”。
 

 




javascriptt高级程序设计当中对类型转换的叙述非常精确 (详见2.7.2   转换成数字)
http://hi.baidu.com/cty901/blog/item/f1a0ca44da1d7688b2b7dcd5.html

ECMAscriptt提供了两种把非数字的原始值转换成数字的方法,即parseInt()和parseFloat()。正如你可能想到的,前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,它们才能正确运行;对其他类型返回的都是NaN。
在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串。parseInt()方法首先查看位置0处的字符,判断它是否是个有效数字;如果不是,该方法将返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的测试。这一过程将持续到发现非有效数字的字符为止,此时parseInt()将把该字符之前的字符串转换成数字。例如,如果要把字符串"1234blue"转换成整数,那么parseInt()将返回1234,因为当它检测到字符b时,就会停止检测过程。字符串中包含的数字字面量会被正确转换为数字,因此字符串"0xA"会被正确转换为数字10。不过,字符串"22.5"将被转换成22,因为对于整数来说,小数点是无效字符。一些示例如下:
var iNum1 = parseInt(“1234blue”); //returns 1234
var iNum2 = parseInt(“0xA”); //returns 10
var iNum3 = parseInt(“22.5”); //returns 22
var iNum4 = parseInt(“blue”); //returns NaN
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,所以要解析十六进制的值,需如下调用parseInt()方法:
var iNum1 = parseInt(“AF”, 16); //returns 175
当然,对二进制、八进制,甚至十进制(默认模式),都可以这样调用parseInt()方法:
var iNum1 = parseInt(“10”, 2); //returns 2
var iNum2 = parseInt(“10”, 8); //returns 8
var iNum2 = parseInt(“10”, 10); //returns 10
如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:
var iNum1 = parseInt(“010”); //returns 8
var iNum2 = parseInt(“010”, 8); //returns 8
var iNum3 = parseInt(“010”, 10); //returns 10

在这段代码中,两行代码都把字符串"010"解析成了一个数字。第一行代码把这个字符串看作八进制的值,解析它的方式与第二行代码(声明基数为8)相同。最后一行代码声明基数为10,所以iNum3最后等于10。
parseFloat()方法与parseInt()方法的处理方式相似,从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前的字符串转换成数字。不过,对于这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的,parseFloat()方法会把这个小数点之前的字符串转换成数字。这意味着字符串"22.34.5"将被解析成22.34。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,而不能用八进制形式或十六进制形式。该方法会忽略前导0,所以八进制数0908将被解析为908。对于十六进制数0xA,该方法将返回NaN,因为在浮点数中,x不是有效字符。此外,parseFloat()也没有基模式。
下面是使用parseFloat()方法的示例:
var fNum1 = parseFloat(“1234blue”); //returns 1234.0
var fNum2 = parseFloat(“0xA”); //returns NaN
var fNum3 = parseFloat(“22.5”); //returns 22.5
var fNum4 = parseFloat(“22.34.5”); //returns 22.34
var fNum5 = parseFloat(“0908”); //returns 908
var fNum6 = parseFloat(“blue”); //returns NaN

2.7.3   强制类型转换
还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。ECMAscriptt中可用的3种强制类型转换如下:
   Boolean(value)——把给定的值转换成Boolean型;
   Number(value)——把给定的值转换成数字(可以是整数或浮点数);
   String(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。可以用下面的代码段测试Boolean型的强制类型转换。
var b1 = Boolean(“”); //false – empty string
var b2 = Boolean(“hi”); //true – non-empty string
var b3 = Boolean(100); //true – non-zero number
var b4 = Boolean(null); //false - null
var b5 = Boolean(0); //false - zero
var b6 = Boolean(new Object()); //true – object
Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。还记得吗,parseInt()和parseFloat()方法只转换第一个无效字符之前的字符串,因此"4.5.6"将被转换为"4.5"。用Number()进行强制类型转换,"4.5.6"将返回NaN,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number()将判断是调用parseInt()方法还是调用parseFloat()方法。下表说明了对不同的值调用Number()方法会发生的情况:
用  法结  果
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()是最简单的,因为它可把任何值转换成字符串。要执行这种强制类型转换,只需要调用作为参数传递进来的值的toString()方法,即把1转换成 "1",把true转换成"true",把false转换成"false",依此类推。强制转换成字符串和调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引发错误:
var s1 = String(null); //”null”
var oNull = null;
var s2 = oNull.toString(); //won’t work, causes an error

在处理ECMAscriptt这样的弱类型语言时,强制类型转换非常有用,不过应该确保使用值的