文档章节

javaScript中加减乘除不精确问题的解决方法

赵延康
 赵延康
发布于 2015/04/14 10:10
字数 547
阅读 34
收藏 0

javaScript 关于小数的四则混合运算时不准确的,所以自定义函数来实现准确的运算

//以下四个函数是算术运算得到精确方法 基本思想就是先将小数转化为整数进行运算,最后在转化回去
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1, arg2) {
    return accMul(arg1, 1 / arg2);
}
//乘法函数,用来得到精确的乘法结果。
//原理:主要是通过将小数全部转化为整数进行运算,最后在依据小数的位数得到相应的小数结果
//说明: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)

}
//加法函数,用来得到精确的加法结果
//说明: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 (accMul(arg1, m) + accMul(arg2, m)) / m;

}
//减法函数,用来得到精确的减法结果
//说明:javascript的减法结果会有误差,在两个浮点数减法的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSub(arg1,arg2)
//返回值:arg1减法arg2的精确结果
function accSub(arg1, arg2) {

    return accAdd(arg1, -arg2);
}


© 著作权归作者所有

共有 人打赏支持
赵延康
粉丝 4
博文 49
码字总数 21691
作品 0
西安
程序员
JavaScript 四则运算(加减乘除小数运算)避免损失精度

在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,...

IceRainYWC
2013/01/22
0
4
js利用H5的requestAnimationFrame()API实现动画效果

为什么要使用requestAnimationFrame: 我们知道,浏览器实现动画绘制无非就是CSS3的动画属性,和JavaScript的和方法(进行DOM的样式循环改变达到动画效果)。说到这可能很多同学都有疑问了,...

newbeehh
06/20
0
0
JS异步执行之setTimeout 0的妙用

  最近在工作中遇到一些问题,大致是关于js执行问题的。由于没搞清执行顺序,导致出现了一些奇怪的bug。 所以这里整理一些有关异步执行的知识(冰山一角角)...   大家都知道js是单线程的...

辛月
07/15
0
0
javascript中的setInterval()和setTimeout()用法比较

setTimeout()和setInterval() 何时被调用执行 定义 setTimeout()和setInterval()经常被用来处理延时和定时任务。setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval...

sunshinewyf
2015/07/25
0
0
用javascript来回答宇宙外面是什么

宇宙外面是什么呢?估计这个问题要困扰很多人,让我们用一段javascript代码来回答一下。 一、从一段代码说起 var 地球 = {名字 : "地球",女友 : "月亮",外面 : {名字 : "太阳系",老大 : "太阳...

国栋
2014/09/02
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
45分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
50分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
58分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
今天
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部