浮点数计算问题,该怎么办? 要转换类型的parseFloat()parseInt() 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 与楼主探讨一下,如果有问题的话请各位指正。以加法这个函数为例//加法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} 基本思路是两个数都乘上足够大的10的n次幂,转化为整数,进行计算后再除以相同的数,得到结果。但这个本身是存在问题的(虽然可能解决了部分情况下出现的问题)。比如说要把2.005转化为整数,不是简单的乘以1000就可以了的,因为2.005*1000.0这本身就是浮点数运算,不一定能得到整数。而是应该把2.005转化为字符串"2.005"然后进行纯字符串操作转化为"2005"并记下小数位数3,在后面的运算中对不同情况进行整数计算,最后再进行位数上的调整。楼主可以试下这个写法:http://blog.lnd.com.cn/?action-viewthread-tid-1473006至少函数中没有浮点数运算的语句,但我自己没怎么用过,不保证不出现问题~~ 另外.toFixed()方法的一些问题:小数点前面必须有有效数字,否则可能出错,比如0.056.toFixed(1)会得到0.0而不是0.1,另外貌似不支持太低版本的浏览器 parseFloat(value)*1000000/1000000试试 转来供大家参考:function arithmetic(a, how, b){ if(a == null) { a = 0; } if(b == null) { b = 0; } if(a.toString().indexOf(".") < 0 && b.toString().indexOf(".") < 0){ return eval(a + how + b); } var ra = a.toString().replace(' ', ''); var rb = b.toString().replace(' ', ''); var arr_a = ra.split("."); var arr_b = rb.split("."); var digit_a = (arr_a.length > 1) ? ra.split(".")[1].length : 0; var digit_b = (arr_b.length > 1) ? rb.split(".")[1].length : 0; var size = (digit_a > digit_b ? digit_a : digit_b); var tmp_a = ra.replace('.', ''); var tmp_b = rb.replace('.', ''); var int_a; var int_b; if(size == digit_a) { int_a = Number(tmp_a); } else { for(var i = 0; i < (size - digit_a); i++) { tmp_a += '0'; } int_a = Number(tmp_a); } if(size == digit_b) { int_b = Number(tmp_b); } else { for(var i = 0; i < (size - digit_b); i++) { tmp_b += '0'; } int_b = Number(tmp_b); } var mul; switch(how) { case "+": mul = size; break; case "-": mul = size; break; case "*": mul = 2 * size; break; case "/": mul = 1; break; } var int_result = eval(int_a + how + int_b) / Math.pow(10, mul); return (int_result);}//alert(arithmetic(8.55, '-', 3.5)); 出处为:北国网论坛, 作者是:Lvivi 是要用parseFloat()或parseInt() 等函数进行类型转换的,且有所误差是正常的,可以多取几位小数点 误差避免不了也和你的系统有关联啊toString你用它转化你所需要的精度啊 滑动门 JS 加载特别慢 获取点击事件 浏览器不兼容 搞了一下午 egg都疼了 求助好心大侠! 诡异问题,click事件需要第二次点击才执行 调查,用过ext的朋友们,你们最常用的控件说说看 cookie增加过期时间,改怎么做? 求救,为什么对不齐啊? 求大神帮忙,急死了。。。就是鼠标按下就开始一个事件,鼠标不按了就停止这个时间,该怎样去实现。。。急。。。 请问:使用javascript怎样得到页面中下拉列表的所有可以选择的值? 怎样使新打开的窗口右上角只有一个关闭按钮?? less问题 关于tab的咨询 div.InnerHtml如何添加图片?
//加法
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
} 基本思路是两个数都乘上足够大的10的n次幂,转化为整数,进行计算后再除以相同的数,得到结果。但这个本身是存在问题的(虽然可能解决了部分情况下出现的问题)。比如说要把2.005转化为整数,不是简单的乘以1000就可以了的,因为2.005*1000.0这本身就是浮点数运算,不一定能得到整数。而是应该把2.005转化为字符串"2.005"然后进行纯字符串操作转化为"2005"并记下小数位数3,在后面的运算中对不同情况进行整数计算,最后再进行位数上的调整。楼主可以试下这个写法:http://blog.lnd.com.cn/?action-viewthread-tid-1473006至少函数中没有浮点数运算的语句,但我自己没怎么用过,不保证不出现问题~~
{
if(a == null)
{
a = 0;
}
if(b == null)
{
b = 0;
} if(a.toString().indexOf(".") < 0 && b.toString().indexOf(".") < 0){
return eval(a + how + b);
}
var ra = a.toString().replace(' ', '');
var rb = b.toString().replace(' ', '');
var arr_a = ra.split(".");
var arr_b = rb.split(".");
var digit_a = (arr_a.length > 1) ? ra.split(".")[1].length : 0;
var digit_b = (arr_b.length > 1) ? rb.split(".")[1].length : 0;
var size = (digit_a > digit_b ? digit_a : digit_b);
var tmp_a = ra.replace('.', '');
var tmp_b = rb.replace('.', '');
var int_a;
var int_b;
if(size == digit_a)
{
int_a = Number(tmp_a);
}
else
{
for(var i = 0; i < (size - digit_a); i++)
{
tmp_a += '0';
}
int_a = Number(tmp_a);
}
if(size == digit_b)
{
int_b = Number(tmp_b);
}
else
{
for(var i = 0; i < (size - digit_b); i++)
{
tmp_b += '0';
}
int_b = Number(tmp_b);
}
var mul;
switch(how)
{
case "+":
mul = size;
break;
case "-":
mul = size;
break;
case "*":
mul = 2 * size;
break;
case "/":
mul = 1;
break;
} var int_result = eval(int_a + how + int_b) / Math.pow(10, mul);
return (int_result);
}//alert(arithmetic(8.55, '-', 3.5)); 出处为:北国网论坛, 作者是:Lvivi
是要用parseFloat()或parseInt() 等函数进行类型转换的,且有所误差是正常的,可以多取几位小数点
toString你用它转化你所需要的精度啊