解决JS浮点数(小数) 运算出现Bug的方法
例如37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, 怎么可能多出这么小数点出来。 后来查了下,发现原来这是JavaScript浮点运算的一个bug。

方法 / 步骤
比如: 7 * 0.8 JavaScript算出来就是: 5.6000000000000005 网上找到了一些解决办法, 就是重新写了一些浮点运算的函数或直接扩大倍数运算。 下面就把这些方法摘录下来, 以供遇到同样问题的朋友参考:
在你要用的地方包含这些函数, 然后调用它来计算就可以了。 / 如果在知道小数位个数的前提下, 可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数), 再进行运算操作, 这样就能得到正确的结果了

<!DOCTYPE html>
<html> <head>
<title>浮点数运算</title>
<meta charset="utf-8">
<meta http-equiv="Pragma" content="no-cache">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
</head>
<body>
<script>
/* 解决JS浮点数(小数) 运算出现Bug的方法
37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, 怎么可能多出这么小数点出来。 后来查了下,发现原来这是JavaScript浮点运算的一个bug。 方法 / 步骤
比如: 7 * 0.8 JavaScript算出来就是: 5.6000000000000005 网上找到了一些解决办法, 就是重新写了一些浮点运算的函数或直接扩大倍数运算。 下面就把这些方法摘录下来, 以供遇到同样问题的朋友参考:*/
/* 在你要用的地方包含这些函数, 然后调用它来计算就可以了。 / 如果在知道小数位个数的前提下, 可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数), 再进行运算操作, 这样就能得到正确的结果了*/
var jjxx={
/*加法函数,返回值:arg1加上arg2的精确结果*/
numAdd:function(arg1, arg2){
var r1, r2, m;
try {
r1 = arg1.toString().split(".")[].length
} catch (e) {
r1 =
}
try {
r2 = arg2.toString().split(".")[].length
} catch (e) {
r2 =
}
m = Math.pow(, Math.max(r1, r2))
return (arg1 * m + arg2 * m) / m
},
/*减法函数, 返回值:arg1减去arg2的精确结果*/
numSubtract:function(arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[].length
} catch (e) {
r1 =
}
try {
r2 = arg2.toString().split(".")[].length
} catch (e) {
r2 =
}
m = Math.pow(, Math.max(r1, r2));
//动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
},
/*乘法函数 返回值:arg1乘以arg2的精确结果*/
numMultiply:function(arg1, arg2) {
var m = ,
s1 = arg1.toString(),
s2 = arg2.toString();
try {
m += s1.split(".")[].length
} catch (e) {}
try {
m += s2.split(".")[].length
} catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(, m)
},
/*除法函数, 返回值:arg1除以arg2的精确结果*/
numDivide:function(arg1, arg2){
var t1 = ,
t2 = ,
r1, r2;
try {
t1 = arg1.toString().split(".")[].length
} catch (e) {}
try {
t2 = arg2.toString().split(".")[].length
} catch (e) {}
with(Math) {
r1 = Number(arg1.toString().replace(".", ""))
r2 = Number(arg2.toString().replace(".", ""))
return (r1 / r2) * pow(, t2 - t1);
}
}
}
</script>
</body>
<script>
alert( * 0.8)
alert(jjxx.numMultiply(,0.8))
</script>
</html>

解决JavaScript浮点数(小数) 运算出现Bug的方法的更多相关文章

  1. 浅谈JavaScript浮点数及其运算

    原文:浅谈JavaScript浮点数及其运算     JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...

  2. JavaScript 浮点数及运算精度调整总结

    JavaScript 浮点数及运算精度调整总结 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题不是J ...

  3. 解决JS浮点数(小数)计算加减乘除的BUG

    在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.1000000000000000000000000001(28位小数).0.10000000000000000000000000 ...

  4. JavaScript浮点数及其运算

    .普及两个函数Math.pow(底数,几次方)Number.toFixed(小数位数)2.浮点数相加function accAdd(arg1,arg2){   var r1,r2,m;   try{r ...

  5. javascript浮点数转换成整数三种方法

    将浮点数转换成整数方法有很多,分享三种常用方法. Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseInt位运算符Math.floor Math.ceil ...

  6. js小数运算出现多位小数如何解决

    小数相乘出现很多位小数的问题:这个问题自己以前也遇到过,现在特意来总结一下: Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表 ...

  7. 搞懂js中小数运算精度问题原因及解决办法

    js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型. number类 ...

  8. 【Python】解决浮点数间运算存在不确定尾数的问题

    #浮点数间运算存在不确定尾数,所以会输出False if 0.1+0.2==0.3: print("Ture\n") else: print("False\n" ...

  9. JavaScript 浮点数陷阱及解法

    众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004.1-0.9=0. ...

随机推荐

  1. SPOJ COT2 Count on a tree II (树上莫队)

    题目链接:http://www.spoj.com/problems/COT2/ 参考博客:http://www.cnblogs.com/xcw0754/p/4763804.html上面这个人推导部分写 ...

  2. oracle RAC 11g sqlload 生产表导入数据(ORA-12899)

    背景:由于即将来临的双十一,业务部门(我司是做京东,天猫的短信服务),短信入库慢,需要DBA把数据库sqlload进数据库. 表结构如下: MRS VARCHAR2(100), STATUS VARC ...

  3. Spark Streaming概念学习系列之SparkStreaming的高层抽象DStream

    不多说,直接上干货! SparkStreaming的高层抽象DStream 为了便于理解,Spark Streaming提出了DStream抽象,代表连续不断的数据流. DStream 是一个持续的R ...

  4. 基于Doxygen的C/C++注释原则

    基于Doxygen的C/C++注释原则 标注总述 .文件头标注 . 命名空间标注 . 类.结构.枚举标注 . 函数注释原则 . 变量注释 . 模块标注 . 分组标注 总述 华丽的分隔线 //----- ...

  5. 使用CocoaPods更新第三方库出错的解决办法

    使用CocoaPods更新第三方库出错的解决办法 执行完pod install或pod update之后,控制台抛出以下警告信息: [!] The xx [Debug] target override ...

  6. 路飞学城Python-Day19

    [23.绑定方法与非绑定方法介绍] 再类的内部的定义的函数分为两大类: 1.绑定方法: 绑定到对象的方法:直接用def做的函数属性,类内部定义的函数,如果没有绑定装饰器,就是给对象使用的函数,绑定给谁 ...

  7. 9、Collaborative Metric Learning Recommendation System: Application to Theatrical Movie Releases------CML推荐系统(电影院放映的应用)

    一.摘要: 主要是做一个基于协作(深度)度量学习(CML)的系统来预测新剧场版本的购买概率.即测量产品的空间距离来预测购买概率. 二.模型 该图分为两部分,先计算右边,右边通过深度度量学习(DDML) ...

  8. 三、frpc 完整配置文件

    # [common] is integral section [common] # A literal address or host name for IPv6 must be enclosed # ...

  9. Shiro:授权的相关实现

    Shiro:授权的相关实现 一.使用Shiro过滤器实现授权 设置好授权拦截跳转的请求地址 /** * 创建ShiroFilterFactoryBean */ @Bean public ShiroFi ...

  10. Ubuntu下使用crontab部署定时任务

    Ubuntu下使用crontab部署定时任务 安装cron apt-get install cron 开启crontab日志 默认情况下的日志是没有开启的,我们需要找到 /etc/rsyslog.d/ ...