js小数运算出现多位小数如何解决_javascript技巧

和大家分享一个有趣的测试:

0.1+0.2 == 0.3 //false
顿时郁闷,好吧!原来0.1+0.2变成:0.30000000000000004
再来一个 2.4/0.8 =>2.9999999999999996 没办法换种方式,都转换成整数 (2.4 * 100)/(0.8 * 100)
10.22 现在要减去 0.11 结果值又出现了很多的小数 10.110000000000001,然后我就用了 toFixed 方法来过滤小数,但是不知道跟前面那种转换成整数后再执行哪种效率高,好!还是试下再说吧!

var date1 = new Date();
for(var i = 0; i < 10000; i++){
 var result1 = (10.22 - 0.11).toFixed(2);
}
alert(new Date() - date1);//效率低

var date2 = new Date();
for(var j = 0; j < 10000; j++){
 var result2 = (10.22 * 1000 - 0.11 * 1000) / 1000;
}
alert(new Date() - date2);//效率高

alert(0.1 + 0.2 == 0.3); //既然返回false
alert(0.1 + 0.2); //既然返回0.30000000000000004
alert(parseFloat(0.1) + parseFloat(0.2)); //还是返回0.30000000000000004

查了一些资料,一是 JavaScript 浮点数计算的 Bug,另一个是和计算机最终转换成二进制计算有关系,但是为什么不是所有小数都会有这种现象,目前我也不清楚,有时间再去深入研究一下。

解决方法:
解决这种问题两种方法,第一种就是利用JavaScript 的toFixed(n) 方法,直接获取N 位小数,不过,个人觉得这种方法在数据精度上会有一些问题。如果数据精度要求不高的话可以使用。

alert((0.1 + 0.2).toFixed(1));

第二种方法就是自己编写运算方法。以下是自定义加法函数,使用此方法进行相加会避免上面问题。

//自定义加法运算
function addNum (num1, num2) {
 var sq1,sq2,m;
 try {
  sq1 = num1.toString().split(".")[1].length;
 }
 catch (e) {
  sq1 = 0;
 }
 try {
  sq2 = num2.toString().split(".")[1].length;
 }
 catch (e) {
  sq2 = 0;
 }
 m = Math.pow(10,Math.max(sq1, sq2));
 return (num1 * m + num2 * m) / m;
}
alert(addNum(0.1, 0.2));

当然,简单一点也可以写成:alert((num * 3 + 10 * 3) /3); 这样也不会出现 N 多位小数。
alert((num * 3 + 10 * 3) /3); 与 alert(num + 10); 这两种写法计算机在底层转换成二进制运算是有区别的,或许这就是出现上述问题的原因,还有待我们去深入研究,大家可以多多讨论。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索js小数运算
, js小数运算溢出
js加法多位小数
javascript 小数运算、javascript 运算符、javascript 运算、javascript 或运算、javascript三目运算符,以便于您获取更多的相关知识。

时间: 2024-11-08 19:13:35

js小数运算出现多位小数如何解决_javascript技巧的相关文章

JS格式化数字保留两位小数点示例代码_javascript技巧

问题:在JS中格式化数据保留两位小数的函数的多种方法 最好方法: 保留两位好像是这样吧 复制代码 代码如下: var a = 9.39393; alert(a.toFixed(2)); 说明: alert(Number.toFixed(9.39393)); 返回的是9.39 但是只有ie5.5以上的版本才支持. 其它方法: function roundFun(numberRound,roundDigit) //四舍五入,保留位数为roundDigit { if (numberRound>=0)

JS中toFixed()方法引起的问题如何解决_javascript技巧

最近发现JS当中toFixed()方法存在一些问题,采用原生的Number对象的原型对象上的toFixed()方法时,规则并不是所谓的"四舍五入"或者是"四舍六入五成双",所谓"四舍六入五成双",在百度百科上给的解释是:也即"4舍6入5凑偶"这里"四"是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1:当5后无有效数字时,

js小数计算小数点后显示多位小数的实现方法_javascript技巧

首先写一个demo 重现问题,我使用的是一个js在线测试环境[打开] 改写displaynum()函数 function displaynum(){var num = 22.77;alert(num + 10);} 点击Show按钮 结果显示32.769999999996 出现了N多小数. 也并不是所有数字都会出现这种现象, 除了 22.99  2.777 , 好像这几个数字也没什么特殊. 查了一些资料, 一是JS浮点数计算的bug, 另一个是和计算机最终转换成二进制计算有关系, 但是为什么不是

Javascript浮点数乘积运算出现多位小数的解决方法

 这篇文章主要介绍了Javascript浮点数乘积运算出现多位小数的解决方法,需要的朋友可以参考下 Javascript在进行浮点数的乘积运算,会出现多位小数的情况.    这是由于在运算的时候先把浮点数转化成二进制后进行运算,但是有的小数在二进制编码后出现无限循环,因而导致计算出现了误差,在其它变成语言中也有类似的问题.    原因解释参考自百度知道:    例如:求1038.1-1000  1038.1=10000001110.00011001100110011001100110011001

decimal 型的数字,有如果有小数,只保留2位小数,没有小数,就只显示整数部分?

问题描述 decimal型的数字,有如果有小数,只保留2位小数,没有小数,就只显示整数部分,不显示小数部分?用vb.net写谢谢大家 解决方案 解决方案二:可以强制转化成整数和原来数值比较不等的说明是小数,ToString("0.00")等于说明是整数,直接取刚才的整数解决方案三:vb不会,C#的:Math.Round(1.234,2);

JS取数字小数点后两位或n位的简单方法_javascript技巧

在js中有时要用到取float数字的小数点后两位的情况. var num=10/3; function f(num,n){ return parseInt(num*Math.pow(10,n)+0.5,10)/Math.pow(10,n); } alert(f(num,2)); 以上就是小编为大家带来的JS取数字小数点后两位或n位的简单方法全部内容了,希望大家多多支持~ 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ja

JavaScript如何实现对数字保留两位小数一位自动补零_javascript技巧

本章节介绍一下如何实现对数字保留两位小数效果,如果数字的原本小数位数不到两位,那么缺少的就自动补零,这个也是为了统一的效果,先看代码实例: function returnFloat(value){ var value=Math.round(parseFloat(value)*100)/100; var xsd=value.toString().split("."); if(xsd.length==1){ value=value.toString()+".00"; r

js toFixed()方法的重写实现精度的统一_javascript技巧

但凡用过js 中的toFix() 方法的, 应该都知道这个方法存在一个小小的BUG. 在IE 下和FF 下对于小数的进位有点不同. 例如( 0.005)在ie 下 toFix(2)=0.00. 在FF 下 toFix(2)=0.01. 这样就会造成数据的差异. 我们可以通过 重写 这个方法来实现精度的统一. 复制代码 代码如下: Number.prototype.toFixed = function(s) { return (parseInt(this * Math.pow( 10, s ) +

JS按位非(~)运算符与~~运算符的理解分析_javascript技巧

那么,对于typeof var!=="number"的类型来说,进行运算时,会尝试转化成32位整形数据,如果无法转换成整形数据,就转换为NaN: JS在位运算上用了更简便的一种方法来实现这中运算,那么它的实现原理大致上可以这样理解: 复制代码 代码如下: var testData=-2.9; var testResult=(typeof testData==="number"&&!isNaN(testData)&&testData!=