解决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. ...
随机推荐
- Java类的根Object
一.Object类介绍 Object全名java.lang.Object,java.lang包在使用的时候无需显示导入,编译时由编译器自动导入.Object类是类层次结构的根,Java中所有的类从根本 ...
- ROS-机器人建模与仿真概论
前言:无论是因为高昂的设备费用还是为了减少实验次数,仿真都是十分必要的. ROS提供了很多优秀的仿真方式,下面来介绍一下: URDF:Unified Robot Description Format, ...
- Centos下MongoDB数据库的安装以及配置开机自启动(三)
最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. 在服务器上完全可以用yum来安装管 ...
- BZOJ2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理)
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4920 Solved: 2389[Submit][Sta ...
- Python 之 入门须知
1.Python2.0不支持中文,3.0支持 2.版本问题
- Codeforces Round #493 (Div. 2) B. Cutting 前缀和优化_动归水题
不解释,题目过水 Code: #include<cstdio> #include<cmath> #include<algorithm> using namespac ...
- Linux学习01
Linux学习第一天 1.使用VM安装RHEL7.0 具体参见刘遄老师的<Linux就该怎么学>https://www.linuxprobe.com/chapter-01.html 2.R ...
- Mysql字段合并
现有数据 合并字段显示:利用GROUP_CONCAT(course,":","score") 严格区分大小写!GROUP_CONCAT 复制代码 SELECT ...
- pytorch 7 optimizer 优化器 加速训练
import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplo ...
- Vijos 1456 最小总代价 (状压dp)
看到这道题n只有16,就可以想到状压dp 每个人只有经过或者没经过,那就用1表示经过,0表示没经过 但是不是当前在谁那里,所以再加一维来记录 所以f[state][i]表示在物品在i,当前的状态是st ...