`
highfly-s
  • 浏览: 102126 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浮点运算

阅读更多

最近在做一个工资核算的系统,所有的运算全部在前台进行,因此用了的是JS来做。
做完以后,经手工核算,发现一个奇怪的问题。就是JS算出来的结果跟用计算器算出来的结果有差距。
想了很久,也没有想出问题出在哪里。
  问题这样的:
  37.5*5.5=206.08  (JS算出来是这样的一个结果,我四舍五入取两位小数)
  我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998
  怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。
  我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);
}


//减法
 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));
     n=(r1>=r2)?r1:r2;
     return ((arg1*m-arg2*m)/m).toFixed(n);
 }


Number.prototype.subs = function(arg){
    return Subtr(this,arg);
}

  在你要用的地方包含这些函数,然后调用它来计算就可以了。
  比如你要计算:7*0.8 ,则改成 (7).mul(8)
  其它运算类似,就可以得到比较精确的结果。

分享到:
评论

相关推荐

    stc15系列单片机浮点运算性能测试

    在许多实际应用中,浮点运算的需求日益增强,例如在数学计算、信号处理等领域。STC15系列单片机虽然基于传统的8位架构,但通过内置硬件支持或软件库的方式,也能实现浮点运算功能。本文将详细探讨STC15系列单片机的...

    浅谈linux kernel对于浮点运算的支持

    Linux内核对于浮点运算的支持主要分为两种情况:带有浮点运算单元(FPU)的处理器和不带FPU的处理器。浮点运算单元通常用于处理浮点数计算,提高科学计算和图形处理等领域的效率。 对于带有FPU的处理器,如X86架构...

    底层硬件如何实现浮点运算_浮点fpga_浮点运算_fpga_FPGA浮点运算_硬件_

    浮点运算在计算机科学中扮演着至关重要的角色,特别是在高性能计算、图形处理和科学计算等领域。底层硬件如何实现浮点运算涉及到多个复杂的技术层面,其中FPGA(Field-Programmable Gate Array)作为一种可编程逻辑...

    stm32f407 FPU浮点运算

    这款MCU内置了浮点单元(FPU),支持单精度和双精度浮点运算,极大地提高了在嵌入式系统中的浮点计算能力。本篇文章将深入探讨STM32F407的FPU浮点运算,以及如何利用MDK(Keil uVision)进行源代码开发。 浮点运算...

    c51fps.lib浮点运算库

    在嵌入式开发领域,尤其是使用单片机如STM32进行微控制器设计时,我们经常需要处理浮点运算。浮点运算对于处理涉及精确数值计算的应用至关重要,比如传感器数据处理、滤波算法或者数学运算等。然而,传统的8位单片机...

    TI dsp28335浮点运算库

    TI官方提供的浮点运算库是针对这款处理器优化的,旨在提高代码执行效率,降低开发难度。 浮点运算库的核心价值在于其包含了一系列预编译的高效算法,这些算法通常包括但不限于快速傅里叶变换(CFFT)、无限脉冲响应...

    利用FPGA实现浮点运算的verilog代码.rar

    本资源“利用FPGA实现浮点运算的verilog代码.rar”提供了使用Verilog编程语言实现浮点运算的示例,这对于理解和掌握FPGA设计以及高速计算应用具有重要意义。 浮点运算在数字信号处理、图像处理、高性能计算等领域的...

    浮点运算方法和浮点运算器

    浮点运算方法和浮点运算器是计算机科学中处理浮点数的重要组成部分,它们涉及到浮点数的加法、减法以及其他数学运算的实现。浮点数是一种用于表示较大或较小数值的数据类型,通常用于科学计算和工程领域,因为它们...

    计算机组成原理:3.5 浮点运算器.ppt

    在探索计算机组成的精微奥秘中,浮点运算器无疑是其中最为引人瞩目的焦点之一。它负责处理科学计算、数据分析等领域中不可或缺的浮点数四则运算。本文将以浮点运算器为中心,深入解析其工作原理和实现方式,从而为...

    FP系列浮点运算指令.rar

    FP系列浮点运算指令是计算机科学中的一个重要领域,特别是在处理器设计和编程中。浮点运算主要涉及浮点数(即带有小数部分的数字)的数学运算,如加法、减法、乘法和除法。这些运算在科学计算、图形处理、物理模拟等...

    DSP编程技巧之---详解浮点运算的定点编程

    DSP编程技巧之详解浮点运算的定点编程 DSP 编程技巧之详解浮点运算的定点编程是指在不支持硬件浮点运算的处理器上,对浮点数的处理需要通过编译器来完成。在支持硬件浮点处理的器件上,对浮点运算的编程最快捷的...

    nVIDIA显卡CUDA性能测试工具,可测试nVIDIA显卡的浮点运算性能

    这个工具可以帮助用户获取NVIDIA显卡的详细信息,包括CUDA核心的数量、频率、内存规格、温度、功耗等,并且可以进行浮点运算性能测试。在进行测试时,CUDA-Z会运行一系列计算密集型的任务,通过测量GPU在执行这些...

    STM32F407学习板 开发板 全部例程原理图 FPU浮点运算

    STM32F407的FPU支持单精度(Single-Precision)浮点运算,遵循ARMv7E-M架构的浮点运算规范,能够大大提高处理浮点数的速度,减轻CPU的负担,提升整体系统的响应能力。 在STM32F407的学习板和开发板上,开发者可以...

    faster_rcnn浮点运算次数

    Faster rcnn test浮点运算次数,包括:卷积实现过程,Faster rcnn总体结构和参数

    ARM处理器Linux下浮点运算单元运用

    ### ARM处理器Linux下浮点运算单元运用 #### 1. 浮点运算单元(FPU)简介 浮点运算单元(Float Point Unit, FPU)是一种专门用于处理浮点数的协处理器,在各种科学计算、图形处理及信号处理等领域中扮演着重要角色。...

    faster_rcnn test 浮点运算量

    **RCNN系列目标检测算法详解** 目标检测是计算机视觉领域中的关键任务,旨在识别和定位图像中的...在实际工程中,理解这些算法的浮点运算量有助于选择适合特定硬件环境的模型,并通过`tools`进行模型的调试和优化。

    基于51单片机的超强科学计算器--精确浮点运算

    本项目“基于51单片机的超强科学计算器”旨在实现一个功能强大的浮点运算计算器,其特点包括处理大范围的数字、高精度显示以及错误检测机制。 首先,该计算器能处理的数字范围极广,从10的负38次方到10的38次方,这...

    浮点运算[参照].pdf

    在现代软件开发领域,浮点运算的精确性和效率直接影响到最终产品的性能和可靠性,特别是在科学计算、图形渲染以及需要高精度数值处理的众多应用场景中。浮点运算不仅包括基本的四则运算,还涉及到复杂的数值表示、...

Global site tag (gtag.js) - Google Analytics