100分请教一问题:javascript的浮点数运算,解决问题就立即给分!

qidizi 2005-07-29 03:39:00
问题:
下面的运算为什么它不能是正确的运算呢?因为我要的是准确的数据,而不是要一个约等的!
(0.1-0.08) == 0.020000000000000004

我的运算中只是二位小数,但是是希望所有的小数也适用的方法!
除了把小数转换成整数运算完成后再还原回小数的方法来运算外,能否有更加方便的正确的方法,不能要四舍五入的方法!因为要是进行乘除时就会相差.

我希望有一个涵数什么的,比如转换成相同等级后它就不再出现约等的算法!
...全文
177 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qidizi 2005-07-29
  • 打赏
  • 举报
回复
瞧来不再容易的办法了,我想了一个变通的办法,但是没有空考虚除法了.

function yunshuan(a,how,b){//正确浮点运算
if(a.toString().indexOf(".") < 0 && b.toString().indexOf(".") < 0){//没小数
return eval(a + how + b);
}
//至少一个有小数
var alen = a.toString().split(".");
if(alen.length == 1){//没有小数
alen = 0;
}else {
alen = cutheadendblank(alen[1]).length;
}
var blen = b.toString().split(".");
if(blen.length == 1){
blen = 0;
}else {
blen = cutheadendblank(blen[1]).length;
}
if(blen > alen)alen = blen;
blen = "1";
for(;alen > 0; alen--){//创建一个相应的倍数
blen = blen + "0";
}
switch(how){
case "+":
return (a * blen + b * blen) / blen;
break;
case "-":
return (a * blen - b * blen) / blen;
break;
case "*":
return ((a * blen) * (b * blen)) / (blen * blen);
break;
default:
alert("你要求的\t" + how + "\t运算未完成!");
return eval(a + how + b);
}
}
cxz7531 2005-07-29
  • 打赏
  • 举报
回复
to hbhbhbhbhb1021(天外水火(才学JAVA,郁闷)) (
---------------
“运算前把所有数字全部乘以100(你只是两位小数)他转换成整数,最后再除以100.00”也是不行的,因为乘100、除100本身就是浮点运算,也会出误差。应该把“乘100、除100”的工作用字符串解析来代替,解析完毕再转换为整数,进行运算,运算完的结果用字符串解析的方式加上小数点,返回
hbhbhbhbhb1021 2005-07-29
  • 打赏
  • 举报
回复
double型和float型都这样的,这是他存储时候的问题
你自己也说了方法了
你怕有偏差
就在运算前把所有数字全部乘以100(你只是两位小数)他转换成整数,最后再除以100.00就可以了
Fanxr 2005-07-29
  • 打赏
  • 举报
回复
在结果中加上转换,定义小数位数。
cxz7531 2005-07-29
  • 打赏
  • 举报
回复
浮点数运算肯定有误差,原则上只能把小数转换成整数运算完成后再还原回小数。或者借助字符串过渡。
lfecnu 2005-07-29
  • 打赏
  • 举报
回复
用vbscript吧:
<script language="vbscript">
function test()
dim a1,a2
a1=0.1
a2=0.08
msgbox a1-a2
end function
</script>

87,921

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧