导航:首页 > 解决方法 > js中小数运算不精准的解决方法

js中小数运算不精准的解决方法

发布时间:2022-08-08 08:56:48

① js 中Math.round()精度问题急

不是BUG,最简单的alert(0.56*100);。JavaScript小数在做四则运算时,精度会丢失。
具体可参考IEEE
754的浮点计数法

② js四舍五入问题 不准确

你的这个问题貌似连续问了好几天,也问了好几个了,难道一直都没有解决的吗?


如果你一直都没有理解的话,那么我来给你仔细地讲一讲。


首先我们来看一段JS代码:


vara=500.50;
varb=6.97;
varresult=a*b;
alert(result);


那么,我们alert之后的结果是:

3488.4849999999997

什么这样?


网上有网友说,这是JavaScript的浮点数运算BUG,其实,并不能算是BUG,而是由于浮点数计算精度造成的误差;


这样一来,你所说的结果为3488.485,对于JavaScript来说,就不准确了。


然后我们再来看下面的代码:

vara=500.50;
varb=6.97;
varc=a*b;//这里的a*b其实是3488.4849999999997
varresult=Math.round(c*100)/100;//那么它乘以100之后是348848.49999999997
//然后,取整后是348848,除100后是3488.48
alert(result);//结果自然就是3488.48


输出:

3488.48


好的,到这里相信你已经知道它产生的原因了,如果你想更细化地知道它为什么会出现那么多的小数位,可以看这篇文章的相关介绍:


【float浮点数的二进制存储方式及转换】http://blog.csdn.net/zcczcw/article/details/7362473


那么接下来,看看如何解决这个问题:


我们知道,问题是出在了二进制数据计算和保存的过程之中,那么,我们就要在它进行计算和保存之前,对其进行处理,


如何处理呢?我们已经知道最初参与计算的两位浮点数都是两位小数,同时我们还需要以两位小数后面的一位小数来决定是否四舍五入,这样,我们将其中一个浮点数的小数点后移3位,这样能够让我们获取到的结果保持在我们需要的小数位后3位都在整数部分,也就不存在浮点数BUG的问题了:

vara=500.50*1000;//让其中一个参与运算的浮点数小数点后移3位
varb=6.97;
varc=a*b/1000;//计算完成后,再前移三位
alert(c);//我们得到的中间值结果准确!
varresult=Math.round(c*100)/100;//再参与四舍五入计算
alert(result);//结果准确


输出结果 :

3488.49


另外,像这样在JavaScript下计算浮点数的过程由于经常会出现这种不可控的现象,所以,聪明的程序工程师们写了很多规避这种不可控现象的函数,下面就给你提供一些这方面的资料:


【js浮点数精确计算函数(加,减,乘,除)】http://www.cnblogs.com/konooo/archive/2010/01/23/1654617.html


【JS浮点数运算Bug的解决办法】 http://hi..com/bing2liuliu/item/6b201a48ea51c40b6dc2f0b6


——————

最后我想说的是,我这几天混迹于网络知道,至少看你问过这个问题四遍了,也就是说,这个问题是我看到的你的第四个相同的问题。


而你在其它几个问题里,并不是没有得到答案,而那几个问题回答的答案也相对比较明确了。


你所要求的:“不要什么公式”、“简单的”等要求,是有的,粘贴复制就可以了,把他们提供的方法粘贴到你的代码上,调用就可以了。


但这样好像还无法满足你,让我们这些为此兢兢业业,试图解决各种有挑战性问题的网友和程序员们情何以堪呐!


我真想写几K的文档,就建完了一个站,但它不现实不是....

③ js为什么不能正确处理小数运算

js 不能正确处理小数运算,包括其它高级编程语言一样,这不是语言本身的设计错误,而是计算机内部本身就不能正确处理小数的运算,对小数的运算往往会得到意想不到的结果,因为并不是所有的十进制小数能被二进制表示。建议看看计算机组成原理的书

④ 为何js计算带有小数的加法的时候会出现误差

很正常的,浮点数运算的误差。哪种语言都这样,只是误差大小不同而已。
用解析字符串的方式移动小数点,转化为整数,完毕后,在把小数点复位。
浮点数运算的时候,先转化为二进制,用二进制来算,结果再转回十进制
例如 :求1038.1-1000
1038.1=10000001110......
1000= 1111101000
1038.1转化为二进制是个无限循环小数,1100是循环节,只能取近似值,误差就是这里产生的
如果浏览器版本高,可以用toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.
后有固定的 num 位数字。如果必要,该数字会被舍入,也可以用 0 补足,以便它达到指定的长度。如果 num 大于 le+21,则该方法只调用 NumberObject.toString(),返回采用指数计数法表示的字符串。
语法
NumberObject.toFixed(num)
返回值
返回 NumberObject 的字符串表示,不采用指数计数法,小数点后有固定的 num 位数字。如果必要,该数字会被舍入,也可以用 0 补足,以便它达到指定的长度。如果 num 大于 le+21,则该方法只调用 NumberObject.toString(),返回采用指数计数法表示的字符串。

抛出
当 num 太小或太大时抛出异常 RangeError。0 ~ 20 之间的值不会引发该异常。有些实现支持更大范围或更小范围内的值。

当调用该方法的对象不是 Number 时抛出 TypeError 异常。
在本例中,我们将把数字舍入为仅有一位小数的数字:

Show the number 13.37 with one decimal:
<script type="text/javascript">
var num = new Number(13.37);
document.write (num.toFixed(1))
</script>

输出:
Show the number 13.37 with one decimal:
13.4

阅读全文

与js中小数运算不精准的解决方法相关的资料

热点内容
黑pvcu管连接方法视频 浏览:191
用什么方法检查食道癌最准确 浏览:950
传统方法怎么去掉豆皮 浏览:240
对教学方法的选择取决于三方面 浏览:648
模型液压挖掘机连接遥控器的接线方法 浏览:107
多次项的次数计算方法 浏览:940
社会调查方法分析理论 浏览:510
用什么土方法制着鱼粉 浏览:237
脑卒中的针灸及推拿方法如何应用 浏览:403
电脑画虾的简单方法 浏览:125
儿童去痣好方法有哪些 浏览:258
13种水果的保鲜方法有哪些 浏览:793
学会方法图片 浏览:615
治疗频繁遗精的方法 浏览:900
慢阻肺的中医治疗方法 浏览:578
透骨草治疗骨刺方法 浏览:471
千里鹰望远镜使用方法 浏览:186
分析经济影响的方法 浏览:20
坐侧马桶怎么安装方法 浏览:563
如何用物理方法解决手机进水 浏览:713