`
songofhawk
  • 浏览: 26497 次
  • 来自: ...
社区版块
存档分类
最新评论

Javascipt中精确小数运算的实现

阅读更多

基于Web的应用程序,经常需要在页面中作些简单的计算,用作数据提交前的验证,或者给用户提供更友好的信息。但由于十进制小数并不总能用二进制小数精确表示,在进行小数运算时,经常会出现“莫明其妙”的误差,比如“33*2.46=81.179999999999999”之类的。如果要在页面上显示计算结果,特别是当这个结果表示金额的时候,误差通常是不可容忍的。

网上有人说Javasript不能做精确运算,所以会出现误差云云。这当然是不对的,这种情况应该是由计算机二进制表示的本质决定的。应该说,Javascript的表现其实还好一些,因为在数字进行运算之前,我们总是可以得到它的精确表示(字符串)。

解决问题的基本思路就是牺牲速度换精度,逐位进行运算,并且自己在程序逻辑中实现进位。为此,Java提供了BigDecimal类。而在Javascript中,我们就没这么幸运了,没有现成的类库可供使用。可能是制订规范的人也认为没必要使用JS来做“科学计算”吧。

我以前做的项目中,经常会碰到计算金额总价、合计、总计之类的“商业计算”,对精确小数运算的需求还是比较迫切的,所以自己开发了一个小数运算的“类”。实现这个类的时候,使用了投机取巧的办法:把小数转换为整数,运算完成后,再转换回去。它唯一能解决的问题就是:避免十进制小数和二进制小数之间的转换误差;它不能提高运算的精度(有效数字),也不能扩大数字的表示范围。

使用方法如下:

js 代码
  1. //使用数字的literal表示,创建一个Decimal对象    
  2. var d1 = new Decimal(3.68);    
  3. //调用该对象的四则运算方法,得到一个新的Decimal对象   
  4. var res=d1.add(2.25);    
  5. //调用该对象的valueOf方法,得到数值   
  6. alert( res.valueOf() ); //显示 5.93    
  7. //或者调用该对象的toString方法,得到数值的字符串表示   
  8. alert( res.toString() ); //显示 5.93    
  9.   
  10. //可用的运算方法对应四则运算的+、-、×、÷   
  11. var d1 = new Decimal(3.68);   
  12. var res=d1.add(2.25);   
  13. assertEquals("3.68+2.25""5.93", res.toString());   
  14.   
  15. var d1 = new Decimal(3.68);   
  16. var res=d1.minus(2.25);   
  17. assertEquals("3.68-2.25""1.43", res.toString());   
  18.   
  19. var d1 = new Decimal(2.22);   
  20. var res=d1.multiply(3.33);   
  21. assertEquals("2.22*3.33", 7.3926, res.valueOf());   
  22.   
  23. var d1 = new Decimal(6.66);   
  24. var res=d1.divide(2.22);   
  25. assertEquals("6.66/2.22", 3, res.valueOf());   
  26.   
  • jslibrary_Decimal.zip (1.9 KB)
  • 描述: 1)Decimal的JS代码 2)相关的JUnit测试代码
  • 下载次数: 269
分享到:
评论
2 楼 y31 2007-05-11  
支持一下,收藏了,开发中可能会用到,呵
1 楼 宏基小键盘 2007-05-11  
不错,收着,谢谢分享

相关推荐

    JavaScript小数点精确计算

    由于JavaScript内部使用的是IEEE 754标准来存储和处理浮点数,这可能导致在进行小数运算时出现精度丢失问题,尤其是在涉及大数字或者循环计算时。本篇将深入探讨这个问题,并提供一些解决方案。 首先,我们来理解...

    Javascript 浮点数精确计算

    JavaScript中的浮点数计算在许多情况下可能会出现不精确的问题,这是由于其内部使用二进制浮点数表示导致的。本文将深入探讨这个问题,并提供一种可能的解决方案。 首先,我们需要理解浮点数在计算机中的存储方式。...

    解决javascript中的浮点数计算不精确问题

    在JavaScript编程中,浮点数计算不精确是一个常见的问题,源于其内部的二进制浮点数表示方式。本文将深入探讨这个问题,并提供解决方案。首先,我们要理解为什么会出现这种不精确性。 JavaScript遵循IEEE 754标准来...

    JavaScript 精确计算(2)

    标题"JavaScript 精确计算(2)"暗示了这是一个系列教程的第二部分,专注于如何在JavaScript中实现精准的数学计算。 在这个主题中,我们可以探讨以下几个关键知识点: 1. **浮点数的不精确性**:JavaScript中的...

    js中小数运算(加、减、乘、除)的问题及一些数学函

    JS 中小数运算(加、减、乘、除)的问题是指在JavaScript中对小数进行加、减、乘、除运算时可能遇到的精度问题。这种问题的产生是由于计算机对浮点数的存储方式和精度的限制。浮点数在计算机中是以二进制形式存储的...

    解决JS浮点数(小数)计算加减乘除的BUG

    在JavaScript中,浮点数(小数)的计算可能会出现一些看似奇怪的结果,这主要是由于计算机内部表示浮点数的方式导致的。这个问题是许多开发者在编写JavaScript代码时可能遇到的一个常见陷阱。本文将深入探讨这个问题...

    js小数运算出现多位小数如何解决

    总结来说,在JavaScript中处理小数运算时,要注意浮点数运算的精度问题,通过多种方法确保计算的准确性。其中,toFixed()方法虽然简单,但可能不够精确;转换成整数进行计算则可以确保精度,但可能会影响性能;...

    浅谈JavaScript中小数和大整数的精度丢失_.docx

    JavaScript中的数字类型主要基于IEEE 754标准的双精度64位浮点数格式进行存储,这在处理小数和大整数时会导致精度丢失问题。本文将深入探讨这两个问题及其背后的原理。 首先,最大整数问题。JavaScript能够表示的...

    javascript精确计算日期处理金额格式化

    JavaScript原生提供了Date对象来处理日期,但其功能相对有限,因此开发者通常会利用各种库来增强其功能,以实现更精确的日期操作。在“JavaScript开发-日期处理库”的标签下,我们可以推断这是一个关于使用...

    C#.NET,JAVASCRIPT数字进行四舍五入保留两位小数

    这里我们将深入探讨C#.NET和JavaScript中如何实现数字四舍五入并保留两位小数的方法。 首先,让我们看看C#.NET中的解决方案。在C#中,我们可以使用`Math.Round`方法来实现四舍五入。这个方法接受一个double类型的值...

    javascript解决小数的加减乘除精度丢失的方案

    在实际开发过程中,当遇到JavaScript中的小数运算精度问题时,可以通过使用上述的方法来保证运算结果的精度。需要注意的是,尽管这些方法可以解决大部分精度问题,但可能会引入额外的计算量,从而影响程序的性能。...

    javascript计算器

    在JavaScript中,小数运算时常会遇到精度损失的问题,这是由于JavaScript使用了IEEE 754浮点数标准来存储和处理数字。这个标准在处理某些特定的小数运算时可能会导致结果不精确,尤其是在涉及大数和小数相除、循环...

    javascript解决小数的加减乘除精度丢失的方案.docx

    在JavaScript中处理小数运算时,经常会遇到一个令人头疼的问题——精度丢失。这主要是因为JavaScript中的数字采用IEEE 754标准下的双精度64位浮点数格式表示,而这种表示方法对于某些特定的十进制小数无法做到精确...

    test_JS-数字精确计算_

    标题"test_JS-数字精确计算_"暗示我们将讨论如何在JavaScript中实现对小范围数字的精确计算。 描述中提到,JavaScript中的浮点数在运算过程中可能会被舍入,丢失部分精度。这是因为浮点数实际上是以二进制表示的,...

    javascript 使用toFixed保留两位小数.pdf

    这个方法对于处理需要精确显示小数部分的场景尤其有用,比如金融计算或者数据展示。在给定的标题和描述中,重点讨论了如何使用`toFixed()`方法来保留两位小数。 `toFixed()`的基本语法是`number.toFixed(digits)`,...

    javascript小数精度丢失的完美解决方法

    在使用JavaScript进行小数运算时,由于JavaScript的内部运算规则是基于二进制实现的,而大多数小数在转换为二进制形式时无法精确表示,这就导致了小数运算时可能出现精度丢失的问题。例如,当执行0.3*1的运算时,...

    JS小数运算出现多为小数问题的解决方法

    在进行JavaScript小数运算时,我们经常会遇到由于浮点数表示的限制而导致的精度问题。由于浮点数在计算机内部是以二进制形式表示的,部分十进制小数无法转换成一个精确的二进制小数,这导致了在运算过程中出现误差。...

    js保留小数位数

    尤其是在涉及财务计算、数据统计等对精度有较高要求的应用场景中,如何精确控制数字的小数位数变得尤为重要。本文将详细介绍一种常用的保留小数位数的方法,并深入探讨其工作原理与应用场景。 #### 核心知识点解析 ...

    js小数计算小数点后显示多位小数的实现方法

    JavaScript中的小数计算时常会遇到精度问题,这是因为JavaScript在内部使用了IEEE 754标准来存储和处理浮点数,这可能导致某些特定的小数计算结果出现不精确的情况。例如,在示例中,22.77加上10的结果不是预期的...

    js计算精度问题解决方案

    6. **利用整数运算**:如果可能,将计算转换为整数运算,因为整数运算在JavaScript中是精确的。例如,将金额乘以100转换为分来计算,最后再除以100转回元。 理解这些原理并学会使用相应策略,可以帮助开发者在遇到...

Global site tag (gtag.js) - Google Analytics