关于JS数学计算误差的问题

在javaScript中,数学计算是一个很坑爹的问题,

  由于系统二进制转十进制的误差,导致浮点数的运算精度很不理想,经常会出现一些意想不到的问题。

  而js自动将小数转为科学计数法的问题,也让一些自己写数学插件的同学痛苦不已。

第一个,浮点数计算精度:

  比如:1.2*3 = 3.599999999....

  

  解决办法:

    ⑴将浮点数乘以10的n次幂化为整数,再进行计算,之后再除以10的n次幂,就可以得到我们想要的数值。即:1.2*3 = 12*3/10 = 3.6;(n为小数点后数位之和);

      至于多个浮点数的乘除,就不多说,算法一样。

     注:此方法还有一些计算有瑕疵,以前做过科学计算器貌似这个算法就有问题,但具体的太久我也记不起来了。但是这个方式处理一般的运算还是足够的。

    ⑵上一方法对于n<0的时候就显然不够用了,如:4.92/15=492/15*Math.pow(10,-2) = 0.329999999....(我们采用了第一种方法,但是却再次陷入原来的浮点计算中)

      所以更改移位方式势在必行。可以这样:

      将浮点数小数点向右移位,当浮点数全部化为整数时,去除小数点再进行计算。算出结果之后对结果进行小数点向左移n位;(n为小数点数位之和)

      注:这个方法的逻辑和上一方法其实是一样的,但是将后面的乘以10的n次幂计算,改为了字符串移位处理,让计算彻底脱离浮点计算的精度问题。

第二个,计算结果自动化为科学计数法

    其实这个也算不上是BUG,但是如果要对数据进行字符串处理的时候,就有些坑了。

最后有兴趣和需要的朋友可以去我的百度网盘下载下我做的js数学计算的包,虽然不大,但主要针对的是JavaScript中Math包计算会出现的计算误差的问题。

  里面有js的加减乘除基本运算(保证精度)、约分、公约数公倍数、数学表示法转换、取小数点位数、四舍五入的各种方法。有兴趣的可以去瞄一瞄

      网盘链接:http://pan.baidu.com/s/1hqCMToC  插件名:com.snowActivity.math.js

时间: 2024-10-08 23:42:58

关于JS数学计算误差的问题的相关文章

关于JS数学计算精度不准和自动转科学计数法的问题

在javaScript中,数学计算是一个很坑爹的问题, 由于系统二进制转十进制的误差,导致浮点数的运算精度很不理想,经常会出现一些意想不到的问题. 而js自动将小数转为科学计数法的问题,也让一些自己写数学插件的同学痛苦不已. 第一个,浮点数计算精度: 比如:1.2*3 = 3.599999999.... 解决办法: ⑴将浮点数乘以10的n次幂化为整数,再进行计算,之后再除以10的n次幂,就可以得到我们想要的数值.即:1.2*3 = 12*3/10 = 3.6;(n为小数点后数位之和); 至于多个

黄聪:JS数学计算精度修正

问题描述 如果我问你,4330.61乘以100等于多少,我猜你肯定跟我说:“肯定是 433061”啊! 是啊,要我我也是这么回答,来来来我们来看看浏览器怎么说吧,如下图 浏览器告诉我,他就是算不对 偌!浏览器告诉我,他就是算不对,这要是给客户算钱,客户不就有意见了.... WHY?计算机计算出来的还不如我自己的心算呢!!!! 如果你想了解什么原因,您请看=>js浮点数精度问题的前世今生? 解决办法 ;(function(){ function mathService(){ this.add=fu

js数学方法应用

找出数组中最大的数 var values = [1, 2, 3, 4, 5, 6, 7, 8]; alert(Math.min.apply(Math,values))//8 这个技巧的关键是把 Math 对象作为 apply()的第一个参数,从而正确地设置 this 值.然后,将数组作为第二个参数. 如果你想选择一个 1 到 10之间的数值,可以像下面这样编写代码:  var num = Math.floor(Math.random() * 10 + 1); 技巧就是Math.random()

深度掌握SVG路径path的贝塞尔曲线指令

一.数字.公式.函数.变量,哦,NO! 又又一次说起贝塞尔曲线(英语:Bézier curve,维基百科详尽中文释义戳这里),我最近在尝试实现复杂的矢量图形动画,发现对贝塞尔曲线的理解馒头那么厚,是完全不能承受富有创意的创作的,至少得有我当年追我老婆的脸皮厚才行. 然而,瞅瞅维基百科上的释义,或者其他一些相关的技术文章,总是离不开各种公式,一大堆变量……例如下面维基截图缩略图: 完全是数学爱好者的菜啊!我想,要是让UI设计师们去学习这些东西,估计还不如一刀来个痛快的! 这就是爱好领域与能力掌握的

18、19年渡一教育web前端高级工程师就业班视频教程下载

下载地址   百度网盘 [课程目录]├──第01节 课件及相关资料  |   ├──课件  |   |   ├──css3  |   |   |   ├──3d翻转.zip  97.77kb|   |   |   ├──css3 .pptx  2.51M|   |   |   ├──css3-Bootstrap.pptx  1.39M|   |   |   ├──css3-动画.pptx  3.36M|   |   |   ├──css3-媒体查询.pptx  806.76kb|   |   |

论js结合数学的应用

js是一门应用极其广泛的语言,它直接决定着一个前端工程师水平以及工资的高低,今天,本人这个前端菜鸟就来总结写js怎样结合数学进行应用. 一:结合勾股定理进行苹果菜单的开发 首先来介绍几个常用的公式 1:平方公式 Math.pow(a,b);代表的是a的b次方: 2:开方公式 Math.sqrt(a,b)代表的是a开b次方: 下面就以苹果实例的开发来讲述其应用 这是html代码 1 <input typ="text"> 2 <input typ="text&q

js 绘制数学函数

<!-- <!doctype html> --> <html lang="en"> <head> <meta charset="UTF-8"> <title>js绘制数学函数</title> </head> <body> <div id="main" style="border-bottom:solid red 0px;he

关于JS的知识,Math(数学对象)

2016年11月24日,星期四 一.理论知识: 1.一个等号=代表赋值: 2.运算顺序:从右向左: 3.数学运算符:+ - * % / ^ : 4.科学计数法:1000 = 1e3: 二.实验代码: 三.理论: 1.a++等于a =a+1: a++的顺序是先赋值,再计算. 代码: <script> var a = 10; var b = 1; //a = a+1; b =++a; document.write(a); </script> 2.字符串的连接符:+ <script

JS之路——Math数学对象

Math数学对象 ceil(数值)大于或等于该数的最小整数 floor(数值)小于或等于该数的最大整数 min(数值1,数值2)返回最小值 max(数值1,数值2)返回最大值 pow(数值1,数值2)返回数值1的数值2次方 random()返回随机数[0,1) round(数值)四舍五入 sqrt(数值)开平方根