`
zzg1022
  • 浏览: 1572 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

JS转换float类型精确结算(转贴)

阅读更多
问题这样的:
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);
}


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

------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是在网上一个JS牛人的博客上转载的,不过上面只提及了加法、乘法和除法的解决办法。
这个时候可能很多人就会想,有了加法,减法还不容易?我就是差点让这个想法给害苦了。
其他的就不多说了,
帖出减法的代码:



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));
     //last modify by deeka
     //动态控制精度长度
     n=(r1>=r2)?r1:r2;
     return ((arg1*m-arg2*m)/m).toFixed(n);
}

分享到:
评论

相关推荐

    Float类型大小端转换测试程序

    本文将深入探讨浮点数在不同字节序之间的转换,主要基于提供的“Float类型大小端转换测试程序”。 标题中的“Float类型大小端转换测试程序”是一个用于验证和实现浮点数在大端和小端系统之间转换的代码。浮点数由多...

    float类型的十六进制转换为十进制

    在MATLAB编程环境中,处理浮点数(如C语言中的`float`类型)的十六进制到十进制的转换是一项基本任务。以下是对这个主题的详细解释。 首先,让我们理解`float`类型的含义。在C语言中,`float`是一种32位的浮点数据...

    float类型在内存中数值转换工具

    本文将详细探讨`float`类型在内存中的数值转换工具及其相关知识点。 `float`类型是计算机科学中广泛使用的浮点数数据类型,它在不同的操作系统(OS)上可能会有不同的存储方式。在内存中,`float`通常按照IEEE 754...

    字节和float转换小工具

    在IT领域,数据类型的理解和转换是至关重要的,尤其是在处理二进制数据和数值计算时。标题中的"字节和float转换小工具"是一个专门针对字节与浮点数(float)之间转换的实用程序。这个小工具设计的目标是帮助开发者...

    C语言中int到float的强制类型转换

    C语言中int到float的强制类型转换 在C语言中,强制类型转换是非常常见的操作之一,而int到float的强制类型转换则是其中一种非常重要的类型转换。在项目中经常会遇到需要将int类型的数据转换为float类型的情况,这...

    float2ascii.rar_acsii浮点_ascii2float_ascii转换float_float转化为ascii_转

    在IT领域,我们经常需要处理各种数据类型,其中包括数值型数据,如浮点数。浮点数在计算机内部是以二进制形式存储的,但在文本显示或者网络传输时,通常会将其转换为ASCII码形式。这个过程涉及到浮点数与ASCII码之间...

    float与16进制转换软件_float_

    在现代计算机科学领域中,浮点数(float类型)是一种常用于表示实数的数据类型,特别适用于处理那些包含小数部分的数值。由于在内存中浮点数是以二进制的形式存储,人们在阅读和理解时往往会觉得不如十进制或十六...

    Labview Float类型转换为四字节Hex小vi

    符合IEEE754规则的Float类型单精度浮点数数据转换为四字节数组的实用小vi

    4BYTE转换成float型代码

    例如,将一个`char`数组直接转换为`float`类型。 3. **内存操作**:在进行字节到浮点数的转换时,可能需要使用指针操作,如`char*`指向4字节数据,然后通过`reinterpret_cast<float*>`将其转换为`float`指针,再...

    基于C++浮点数(float、double)类型数据比较与转换的详解

    在实际开发中,为了确保较高的精度,通常建议使用`double`类型而不是`float`,特别是在涉及数值计算和转换的时候。同时,当将浮点数转换为字符串时,使用`%.8lf`作为精度设置可以提供足够的显示精度,但需注意这并不...

    如何把float类型变量发送到串口调试助手

    总而言之,将float类型变量通过串口发送涉及到数据类型转换和内存地址共享的知识点。正确地使用共用体,可以将float变量的每个字节单独发送,并在串口调试助手等工具中查看其在内存中的实际存储情况。这对于调试和...

    16进制如何转换成float型数据

    在进行串口通信的过程中,经常会遇到需要将从下位机接收到的16进制数据转换为浮点数(float)的情况。以下将详细介绍这一过程的关键步骤和技术细节。 ### 一、16进制数据与浮点数的关系 16进制是一种常用的数制表示...

    C++ VS2015 CString string int float各种类型转换数据类型转换.rar

    C++ VS2015 CString string int float各种类型转换,MFC对话框实现对各种类型数据转换并显示

    HEX-Float转换工具 16进制转成float 或double类型数据的一个小工具

    对于double类型的转换,其过程与float类似,但需处理更多的位数。 这个工具的实用价值在于简化了手动转换的复杂性,尤其是在处理大量数据时。它可以避免人为错误,提高工作效率。例如,在编写底层驱动程序或嵌入式...

    test_string型转换成对应的float类型_float_读取txt文档_C++/C_vs2017_

    在C++编程中,将`test_string`类型的字符串转换为`float`类型的数值是一个常见的操作,特别是在处理包含数值数据的文本文件时。本示例中,我们关注的是如何在Visual Studio 2017(VS2017)环境下,通过文件流...

    float、double类型小数转换16进制

    float、double类型转换16进制工具

    C语言中float类型的实现!

    C语言中float类型的实现! C语言中float类型的实现! C语言中float类型的实现! C语言中float类型的实现! C语言中float类型的实现! C语言中float类型的实现! C语言中float类型的实现! C语言中float类型的实现! ...

    十六进制(HEX)和浮点类型(float、double)转换工具

    而浮点类型,如float和double,是用于存储小数的数值类型,广泛应用于科学计算、图形处理等领域。了解和掌握十六进制与浮点类型的转换是每一位IT专业人员的基本技能。 十六进制是一种逢16进1的计数系统,使用16个...

    mobus rtu传输float 类型变量换算工具

    在进行工控数据采集时,很多设备都是使用RS485 接口传输modbus RTU协议数据,比较常见的是,传输一个字(2个bytes),但是有些变量超过了两个字节,比如float类型、int、long、double类型数据在modbus RTU传输时,该...

    LitJsonExt 支持 float类型

    2. **序列化 `float` 到 JSON**:同样,`JsonMapper.ToJson(float)` 方法可以将 `float` 类型的数据转换为对应的 JSON 字符串,使得 `float` 类型的数据可以顺利地在网络间传输或存储。 3. **集成简单**:...

Global site tag (gtag.js) - Google Analytics