最近在做一个工资核算的系统,所有的运算全部在前台进行,因此用了的是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)
其它运算类似,就可以得到比较精确的结果。
- 浏览: 102126 次
- 性别:
- 来自: 北京
-
最新评论
-
_大大大雄:
关于这个应用, 有些东西想要请教下您行么?
jsp 权限过滤器的应用 -
jptiancai:
博主,看了博客,收获很多,这个例子运行的时候,会报下面的错误: ...
jsp 权限过滤器的应用
发表评论
-
backbone学习资料
2015-07-20 16:37 695理论知识 backbone.js 初探http://we ... -
解析目录树
2015-06-19 19:31 524<ul id="test"> ... -
csv生成
2015-06-19 19:29 656<head> <meta -
网站性能优化解决方案
2015-06-15 14:40 774最近通过查阅资料,发现了一些其他可以提高性能优化的方案1. 使 ... -
八种创建等高列布局
2015-01-04 17:11 605高度相等列在Web页面设计中永远是一个网页设计师的需求。如果 ... -
多次调用同一异步方法体会出现使用相同的属性值问题
2014-11-27 17:56 1726《一》执行同一个方法体,里面有异步的逻辑代码,如果这个异步 ... -
时间的计算
2014-11-19 14:42 617using System; namespace Be ... -
async when then
2014-11-14 11:45 700function test1(){ var def ... -
异步并行串行编程 when
2014-11-14 11:40 744var data = { "51": ... -
HTML 与javascript自解码机制
2014-02-19 14:41 1301关于这个自解码机制,我们直接以一个例子(样例0)来进行说明: ... -
三列百分之比布局
2014-02-11 13:56 699三列布局自适应 -
JSp生重复提交解决方法
2014-01-08 15:42 728看了网上的,有几种方法: 1 在你的表单页里HEAD区加入这段 ... -
AMD 和 CMD 的区别有哪些?
2013-12-25 11:37 760AMD 是 RequireJS 在推广过程中对模块定义的规范化 ... -
firefox 专属css hack
2013-12-20 15:50 721之前只有ie6、ie6、firefox时,只要写!impo ... -
自适应网页设计
2013-11-29 10:39 807一、简单描述:随着移 ... -
跨浏览器兼容性总结
2013-11-25 10:16 3491一、 CSS样式兼容 1. F ... -
IE6 PNG背景透明解决方法(汇总)
2013-10-31 18:25 694IE6 PNG背景透明解决方法(汇总) 方法一: IE6 ... -
兼容IE6 min-width 的CSS 样式
2013-10-23 19:12 906IE6另外一个bug就是它不支持 min-width 属性. ... -
IE6 position:fixed bug (固定窗口方法)
2013-10-23 17:26 824今天herb同 学在twitter上 ... -
不确定图片大小让元素水平垂直居中
2013-10-23 16:53 787<!DOCTYPE html PUBLIC " ...
相关推荐
在许多实际应用中,浮点运算的需求日益增强,例如在数学计算、信号处理等领域。STC15系列单片机虽然基于传统的8位架构,但通过内置硬件支持或软件库的方式,也能实现浮点运算功能。本文将详细探讨STC15系列单片机的...
Linux内核对于浮点运算的支持主要分为两种情况:带有浮点运算单元(FPU)的处理器和不带FPU的处理器。浮点运算单元通常用于处理浮点数计算,提高科学计算和图形处理等领域的效率。 对于带有FPU的处理器,如X86架构...
浮点运算在计算机科学中扮演着至关重要的角色,特别是在高性能计算、图形处理和科学计算等领域。底层硬件如何实现浮点运算涉及到多个复杂的技术层面,其中FPGA(Field-Programmable Gate Array)作为一种可编程逻辑...
这款MCU内置了浮点单元(FPU),支持单精度和双精度浮点运算,极大地提高了在嵌入式系统中的浮点计算能力。本篇文章将深入探讨STM32F407的FPU浮点运算,以及如何利用MDK(Keil uVision)进行源代码开发。 浮点运算...
在嵌入式开发领域,尤其是使用单片机如STM32进行微控制器设计时,我们经常需要处理浮点运算。浮点运算对于处理涉及精确数值计算的应用至关重要,比如传感器数据处理、滤波算法或者数学运算等。然而,传统的8位单片机...
TI官方提供的浮点运算库是针对这款处理器优化的,旨在提高代码执行效率,降低开发难度。 浮点运算库的核心价值在于其包含了一系列预编译的高效算法,这些算法通常包括但不限于快速傅里叶变换(CFFT)、无限脉冲响应...
本资源“利用FPGA实现浮点运算的verilog代码.rar”提供了使用Verilog编程语言实现浮点运算的示例,这对于理解和掌握FPGA设计以及高速计算应用具有重要意义。 浮点运算在数字信号处理、图像处理、高性能计算等领域的...
浮点运算方法和浮点运算器是计算机科学中处理浮点数的重要组成部分,它们涉及到浮点数的加法、减法以及其他数学运算的实现。浮点数是一种用于表示较大或较小数值的数据类型,通常用于科学计算和工程领域,因为它们...
在探索计算机组成的精微奥秘中,浮点运算器无疑是其中最为引人瞩目的焦点之一。它负责处理科学计算、数据分析等领域中不可或缺的浮点数四则运算。本文将以浮点运算器为中心,深入解析其工作原理和实现方式,从而为...
FP系列浮点运算指令是计算机科学中的一个重要领域,特别是在处理器设计和编程中。浮点运算主要涉及浮点数(即带有小数部分的数字)的数学运算,如加法、减法、乘法和除法。这些运算在科学计算、图形处理、物理模拟等...
DSP编程技巧之详解浮点运算的定点编程 DSP 编程技巧之详解浮点运算的定点编程是指在不支持硬件浮点运算的处理器上,对浮点数的处理需要通过编译器来完成。在支持硬件浮点处理的器件上,对浮点运算的编程最快捷的...
这个工具可以帮助用户获取NVIDIA显卡的详细信息,包括CUDA核心的数量、频率、内存规格、温度、功耗等,并且可以进行浮点运算性能测试。在进行测试时,CUDA-Z会运行一系列计算密集型的任务,通过测量GPU在执行这些...
STM32F407的FPU支持单精度(Single-Precision)浮点运算,遵循ARMv7E-M架构的浮点运算规范,能够大大提高处理浮点数的速度,减轻CPU的负担,提升整体系统的响应能力。 在STM32F407的学习板和开发板上,开发者可以...
Faster rcnn test浮点运算次数,包括:卷积实现过程,Faster rcnn总体结构和参数
### ARM处理器Linux下浮点运算单元运用 #### 1. 浮点运算单元(FPU)简介 浮点运算单元(Float Point Unit, FPU)是一种专门用于处理浮点数的协处理器,在各种科学计算、图形处理及信号处理等领域中扮演着重要角色。...
**RCNN系列目标检测算法详解** 目标检测是计算机视觉领域中的关键任务,旨在识别和定位图像中的...在实际工程中,理解这些算法的浮点运算量有助于选择适合特定硬件环境的模型,并通过`tools`进行模型的调试和优化。
本项目“基于51单片机的超强科学计算器”旨在实现一个功能强大的浮点运算计算器,其特点包括处理大范围的数字、高精度显示以及错误检测机制。 首先,该计算器能处理的数字范围极广,从10的负38次方到10的38次方,这...
在现代软件开发领域,浮点运算的精确性和效率直接影响到最终产品的性能和可靠性,特别是在科学计算、图形渲染以及需要高精度数值处理的众多应用场景中。浮点运算不仅包括基本的四则运算,还涉及到复杂的数值表示、...