解决JavaScript浮点数(小数) 运算出现Bug的方法
解决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的方法的更多相关文章
- 浅谈JavaScript浮点数及其运算
原文:浅谈JavaScript浮点数及其运算 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...
- JavaScript 浮点数及运算精度调整总结
JavaScript 浮点数及运算精度调整总结 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题不是J ...
- 解决JS浮点数(小数)计算加减乘除的BUG
在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.1000000000000000000000000001(28位小数).0.10000000000000000000000000 ...
- JavaScript浮点数及其运算
.普及两个函数Math.pow(底数,几次方)Number.toFixed(小数位数)2.浮点数相加function accAdd(arg1,arg2){ var r1,r2,m; try{r ...
- javascript浮点数转换成整数三种方法
将浮点数转换成整数方法有很多,分享三种常用方法. Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseInt位运算符Math.floor Math.ceil ...
- js小数运算出现多位小数如何解决
小数相乘出现很多位小数的问题:这个问题自己以前也遇到过,现在特意来总结一下: Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表 ...
- 搞懂js中小数运算精度问题原因及解决办法
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型. number类 ...
- 【Python】解决浮点数间运算存在不确定尾数的问题
#浮点数间运算存在不确定尾数,所以会输出False if 0.1+0.2==0.3: print("Ture\n") else: print("False\n" ...
- JavaScript 浮点数陷阱及解法
众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004.1-0.9=0. ...
随机推荐
- nyoj--74--小学生算术(水)
小学生算术 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 很多小学生在学习加法时,发现"进位"特别容易出错.你的任务是计算两个三位数在相加时需要多少 ...
- MYSQL中 FIND_IN_SET 函数
每天掌握一点,你的知识财富就多一点 今天在维护项目的时候发现了个MYSQL的FIND_IN_SET函数,之前接触太浅,今天又涨点知识了.下面是做个测试 1.创建一张test表,并添加数据 2.编写s ...
- 4.matlab基础
1 函数句柄 clear all; f1=@cos t=:pi/:pi f1(t) f2=@complex f2(,) clear all %函数句柄 f1=@char %函数句柄转换为字符串 s1= ...
- BZOJ 3720 树分块
借鉴了别人的代码-- //By SiriusRen #include <cmath> #include <cstdio> #include <cstring> #i ...
- linux下通用Makefile写法
linux编译多个源文件的程序比较麻烦,这下就需要通用的Makefile了,编译的时候执行一下make命令就OK,下面介绍通用makfile的写法. 假设现在有以下源文件:file1.h file1. ...
- RTSP/RTP 媒体传输和控制协议
1 前言 本文档主要描述了 NewStream Vision 系统中前端视频服务器(DVR, 网络摄像机), 中心转发服务器以及客户端之间的多媒体通信以及控制协议. 本协议主要基于标准的 IETE 的 ...
- Edge 通过代理无法打开网页,解决方案
netsh winhttp import proxy source=ie
- 服务端 | Nodejs 学习笔记(一)
Node.js 前言: 2009年面世 nodejs.org 官网 https://www.npmjs.com/ 模块社区 github.com 仓库 stackoverflow.com 问答社区 ...
- P1726 上白泽慧音(0分)
题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...
- border-spacing和borer-collapse以及empty-cells属性
1.border-spacing 用于设置表格中,单元格之间的间隙 示例1:border-spacing: 7px: 单元格水平方向7px间隔,垂直方向7px间隔 示例2:border-spacing ...