javascript小数相减会出现一长串的小数位数的原因

<script>
var a='38.8';
var b='6.8';
alert(parseFloat(a)-parseFloat(b));
var a=134.22;
var b=6;
alert(a*b);
</script>
以上代码为什么产生一长串小数位出来,虽然比较精确,可没必要呀。
这个和数据结构有关系,整数型自动转换成正型计算,小数型直接转成double型计算。这是在内存中运算的时候必须这样,你该知道计算机只认识0和1吧,具体的就是浮点精准度的问题。
float 精确到小数点后7位
double 精确到小数点后15位
javascript:document.write( (11.3-10.1).toFixed(2) )
toFixed()方法不仅仅截去多余的小数位,同时它还根据截取位置的下一个小数位进行四舍五入。例如,对于数值10.739,截取到小数点后的两位数,结果将是10.74。而对于数值10.732,截取到小数点后的两位数,结果将是10.73。
注意,在JavaScript中我们只能截取小数点之后0位~20位的小数。
toFixed()方法仅被高版本的浏览器所支持,所以在使用之前最好先检查一下浏览器是否支持该方法,检查的代码如下所示:
var varNumber = 22.234;
if (varNumber.toFixed)
{
varNumber = varNumber.toFixed(2);
}
else //浏览器不支持toFixed()就使用其他方法
{
var div = Math.pow(10,2);
varNumber = Math.round(varNumber * div) / div;
}
这样可以解决,但你想问,怎么可能多出这么小数点出来。
为什么会出现如此无法理解的答案?
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。
比如:7*0.8 JavaScript算出来就是:5.6000000000000005
网上找到了一些解决办法,就是重新写了一些浮点运算的函数。
下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:
程序代码
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1,arg2){
var t1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}
//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1,arg2)
{
var m=0,s1=arg1.toString(),s2=arg2.toString();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
return accMul(arg, this);
}
//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(arg1,arg2){
var r1,r2,m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m+arg2*m)/m
}
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg){
return accAdd(arg,this);
}
在你要用的地方包含这些函数,然后调用它来计算就可以了。
比如你要计算:7*0.8 ,则改成 (7).mul(8)
其它运算类似,就可以得到比较精确的结果。
--------------------------------------------------------------------------
以上是在网上一个JS牛人的博客上转载的,不过上面只提及了加法、乘法和除法的解决办法。
这个时候可能很多人就会想,有了加法,减法还不容易?我就是差点让这个想法给害苦了。
其他的就不多说了,帖出减法的代码:
function Subtr(arg1,arg2){
var r1,r2,m,n;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2));
//last modify by deeka
//动态控制精度长度
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
}
原文:http://blog.sina.com.cn/s/blog_8deabceb01017b7k.html

转载于:https://www.cnblogs.com/smallrock/p/3716520.html

javascript小数相减会出现一长串的小数位数的原因相关推荐

  1. jquery 时间相减获取天数_JQuery Datepicker实现JavaScript日期相减的小例子

    最近水母一直在发关于银行利息的文章,看他算得连脚趾头都快用上了,O(∩_∩)O哈哈~,索性做回好人,帮他写个网页程序算一下. 开始想用PHP写,但是还要做个输入界面,干脆用js了.写js代码的好帮手首 ...

  2. python 浮点数出现长串0 错误位数

    https://stackoverflow.com/questions/10403434/floating-point-in-python-gives-a-wrong-answer >>& ...

  3. 分数加减法混合计算机,分数小数加减混合运算练习题及答案.doc

    分数小数加减混合运算练习题及答案 分数小数加减混合运算练习题及答案 1. 知识目标:会选择比较适合的方法进行分数,小数加减混合运算. 2. 认知目标:通过练习,使学生初步了解将未知转化为已知的数学思想 ...

  4. 带小数的大数相加,大数相减C++实现

    今天我们带来string类的含小数的大数相加.相减的实现过程,具体代码如下 #include<iostream> #include<string> #include<cc ...

  5. 两个double相减_double类型相减有小数误差

    如 :19.9-9.9=9.9999999999999,而不是10double相减会转换成二进制,因double有效位数为 16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差 //两个Do ...

  6. html5数组删除相同数据,js数组相减简单示例【删除a数组所有与b数组相同元素】...

    js数组相减简单示例[删除a数组所有与b数组相同元素] 本文实例讲述了js数组相减.分享给大家供大家参考,具体如下: js数组相减 function arrChange( a, b ){ for (v ...

  7. java Date日期时间相减 精确到毫秒

    本人是代码菜鸟 首先按照从其他地方介绍的普遍的计算方式,Date.getTime获取日期时间的long值来相减 //设置Date格式为"年-月-日 小时:分钟:秒.毫秒" Simp ...

  8. java double相减_完美解决java double数相加和相减的方案

    我就废话不多说了,大家还是直接看代码吧~ /** * double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型 * 整型地方法适合于 ...

  9. 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...

最新文章

  1. 地址池命令 思科理由_思科互联网络操作系统 ——路由器接口
  2. Linux网络编程——浅谈 TCP 三次握手和四次挥手
  3. 有关phpmailer的详细介绍及使用方法
  4. STM32使用FatFs
  5. OS- -操作系统概念
  6. 心电信号去噪(part3)--数学形态学
  7. vba调用linux shell,调用命令提示符并通过VBA中的Shell Exec执行命令
  8. HPU 1476: 括号括号
  9. 结对编程_队友代码分析
  10. Win10升级到最新版本
  11. 10 工作中常见知识汇总
  12. 调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查对应功能是否已经添加
  13. 2018年 数据挖掘“泰迪杯” C题 第一问
  14. 结构化程序设计方法和面向对象程序设计方法的区别
  15. 新浪微博Python登陆
  16. 第十篇:扩展SOUI的控件及绘图对象(ISkinObj)
  17. Linux内核 失速(STALL) 警告说明文档翻译
  18. 4-AT命令交互之-COPS选择营运商
  19. Zabbix简单检查的使用
  20. 心脏三维重构的调研报告

热门文章

  1. 2022-2028年中国科学仪器行业研究及前瞻分析报告
  2. c++ 进程快照_如何在 Linux 中找出内存消耗最大的进程
  3. libseccomp2 (>= 2.3.0) but 2.2.3-3ubuntu3 is to be installed
  4. 利用cre2进行分组模式匹配的实例
  5. python编程问题---第一次
  6. tvm模型部署c++ 分析
  7. AI推理与Compiler
  8. TensorRT 数据和表格示例
  9. Python脚本语言写法
  10. Java基础Switch和循环控制