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

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

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

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

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

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

  

  解决办法:

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

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

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

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

      注:这个方法的逻辑和上一方法其实是一样的,但是脱离了后面的除法计算,而改为字符串处理,让结果精度更有一些保障(个人不敢太相信JS的Math计算,被坑过的自然懂)。

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

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

    附:将科学计数法化为普通计数的函数。

最后,不晓得能不能提交附件,不然就上传一个以前做的js数学计算插件,感觉还是挺管用的

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

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

时间: 2024-10-15 20:40:29

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

用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)

做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel了,下决心一定要找到解决办法 自己在excel里测试过,较长的数字,都会自动变成科学计数法,除非我们把单元格格式设置成“文本型” 哈哈,似乎找到了思路:用poi先把单元格设置成“文本型”就可以了把. 从文档里找到了这个方法HSSFCell.setCellType(int type),怎么看这个方法都

导出csv文件数字会自动变科学计数法的解决方法

其实这个问题跟用什么语言导出csv文件没有关系.Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0.解决这个问题:只要把数字字段后面加上显示上看不见的字符即可,字符串前面或者结尾加上制表符"\t".php 程序可以这样判断,注意一定是"\t",不是'\t'.

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

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

js 科学计数法 转换为 数字字符 突破幂数正数21位,负数7位的自动转换限制

前天工作中要转换后台返回的一个数据,返回是的科学计算的数字字符,用网上能搜索到的常用两种方法转换会有倍数的限制,然后又搜索了很久,还是没有找到好的方法,虽然也有一些自己写的方法,可还是不能像下面两种方法一样能正常转换各种正负科学计数,且突破幂数正数21位,负数7位的自动转换限制.所以对比了下,花一下午修改测试,基本通用了,只是传入的参数必须为字符串的科学计数. var num = new Number('3.54545E-3'); // 3.54545e-7var sBalance = pars

JS数字计算精度误差的解决方法

本篇文章主要是对javascript避免数字计算精度误差的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0.2 = 0.3 啊,那还用问吗?连幼儿园的小朋友都会回答这么小儿科的问题了.但是你知道吗,同样的问题放在编程语言中,或许就不是想象中那么简单的事儿了. 不信?我们可以做个试验. 先来看一段 JS. var num1 = 0.1; var num2 = 0.2; alert(num1+num2 ===

关于js浮点数计算精度不准确问题的解决办法

今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精度的文章.觉得别人写的挺好了,我在简单的总结一下,以方便后续查阅. 浮点数误差产生的原因: 先看一个实例: 0.1 + 0.2 =? 0.1 + 0.2 = 0.3? 我们先来看一段 JS. console.log( 0.1+ 0.2); 输出为 0.30000000000000004.是不是很奇葩

JS数字计算精度问题解决

1 add(a, b) {//相加 2 var c, d, e; 3 try { 4 c = a.toString().split(".")[1].length; 5 } catch (f) { 6 c = 0; 7 } 8 try { 9 d = b.toString().split(".")[1].length; 10 } catch (f) { 11 d = 0; 12 } 13 return e = Math.pow(10, Math.max(c, d)),

关于js中计算精度的问题解决办法

/** * 解决js中浮点数的精度问题 * @parem f 要精度的值 * @parem digit 要精确的位数 * */ var htmlObj = {};htmlObj.formatFloat = function(f, digit) { var m = Math.pow(10, digit);//Math.pow(x,y)返回 x 的 y 次幂的值 return parseInt(f * m, 10) / m;};

js科学计数法问题

//科学计数法转换function getFullNum(num) { //处理非数字 if (isNaN(num)) { return num }; //处理不需要转换的数字 var str = '' + num; if (!/e/i.test(str)) { return num; }; return (num).toFixed(18).replace(/\.?0+$/, "");} 原文地址:https://www.cnblogs.com/lindaCai/p/8695791.h