这和java中的double浮点类型的变量运算类似,具体的内在机制我也不是很清楚,给你一个函数吧,用来格式化小数的,小数点后的位数可以指定。/**
* @功能:将小数四舍五入。
* @param sourceValue: 进行四舍五入的字符串,不能为空。
* @param decimalNum: 保留小数点后几位,默认为2,可以为空。
* @param ifReturnZero: 当传入的字符串为空时是否返回格式化的0,如0.00,默认为false,可以为空。
*/
function roundFloat(sourceValue,decimalNum,ifReturnZero)
{
if(sourceValue=='')
{
if(ifReturnZero)
sourceValue = 0;
else
return '';
}
//如果传入字符串不是数值,则原样返回。
if(isNaN(sourceValue)) return sourceValue;
//如果没有指定decimalNum,则decimalNum默认为2位。
if(typeof(decimalNum)=='undefined' || decimalNum=='') decimalNum = 2;
var multiplyValue=Math.pow(10,parseInt(decimalNum));
return (Math.round(multiplyValue*sourceValue))/multiplyValue;
}
* @功能:将小数四舍五入。
* @param sourceValue: 进行四舍五入的字符串,不能为空。
* @param decimalNum: 保留小数点后几位,默认为2,可以为空。
* @param ifReturnZero: 当传入的字符串为空时是否返回格式化的0,如0.00,默认为false,可以为空。
*/
function roundFloat(sourceValue,decimalNum,ifReturnZero)
{
if(sourceValue=='')
{
if(ifReturnZero)
sourceValue = 0;
else
return '';
}
//如果传入字符串不是数值,则原样返回。
if(isNaN(sourceValue)) return sourceValue;
//如果没有指定decimalNum,则decimalNum默认为2位。
if(typeof(decimalNum)=='undefined' || decimalNum=='') decimalNum = 2;
var multiplyValue=Math.pow(10,parseInt(decimalNum));
return (Math.round(multiplyValue*sourceValue))/multiplyValue;
}
var aa=111.12345;
alert(aa.toFixed(2));
<script language="javascript"> num="0.3000"; //string or number
num2 = num.toString().replace(/(^\d*\.\d*?)(0*$)/,"$1"); //去掉小数点最后的所有0 alert(num2);
</script>
在计算机中因为采用的是二进制,所以大多数小数都存在着“精度”的问题,这是不可避免的在我的计算机中“0.1+0.2”的结果是“0.30000000000000004”,这并不是多“0”只是因为后面还有有效数字。如果“0”后面没有有效数字的话,“0”是会自动消去的,所以上面的那个正则没有任何意义:
//num.toString().replace(/(^\d*\.\d*?)(0*$)/,"$1"); 而toFixed()函数的不足我想你也试过了的。
实际上你的小数无论如何是很少超过15位的,那么用“Math.round()”方法四舍五入到15位就可以把小数点后的“0”去掉了。例如:<script>
var a=0.1;
var b=0.2;
var c=a+b;
c=Math.round(c*1000000000000000)/1000000000000000
alert(c);
</script>