`
DreamWalker_RL
  • 浏览: 1176 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

Java和Js的高精度计算

 
阅读更多
网上找的Java和Js的高精度计算文件,很有用。贴出来希望有人能搜到。在此特向代码原作者致敬!!!

Java:
[java] view plain copy

    import java.math.BigDecimal; 
     
    /**
    * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
    * 确的浮点数运算,包括加减乘除和四舍五入。
    */ 
     
    public class Arith{ 
        //默认除法运算精度 
        private static final int DEF_DIV_SCALE = 10; 
        //这个类不能实例化 
        private Arith(){ 
        } 
     
        /**
         * 提供精确的加法运算。
         * @param v1 被加数
         * @param v2 加数
         * @return 两个参数的和
         */ 
        public static double add(double v1,double v2){ 
            BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
            BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
            return b1.add(b2).doubleValue(); 
        } 
        /**
         * 提供精确的减法运算。
         * @param v1 被减数
         * @param v2 减数
         * @return 两个参数的差
         */ 
        public static double sub(double v1,double v2){ 
            BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
            BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
            return b1.subtract(b2).doubleValue(); 
        } 
        /**
         * 提供精确的乘法运算。
         * @param v1 被乘数
         * @param v2 乘数
         * @return 两个参数的积
         */ 
        public static double mul(double v1,double v2){ 
            BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
            BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
            return b1.multiply(b2).doubleValue(); 
        } 
     
        /**
         * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
         * 小数点以后10位,以后的数字四舍五入。
         * @param v1 被除数
         * @param v2 除数
         * @return 两个参数的商
         */ 
        public static double div(double v1,double v2){ 
            return div(v1,v2,DEF_DIV_SCALE); 
        } 
     
        /**
         * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
         * 定精度,以后的数字四舍五入。
         * @param v1 被除数
         * @param v2 除数
         * @param scale 表示表示需要精确到小数点以后几位。
         * @return 两个参数的商
         */ 
        public static double div(double v1,double v2,int scale){ 
            if(scale<0){ 
                throw new IllegalArgumentException( 
                    "The scale must be a positive integer or zero"); 
            } 
            BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
            BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
            return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
        } 
     
        /**
         * 提供精确的小数位四舍五入处理。
         * @param v 需要四舍五入的数字
         * @param scale 小数点后保留几位
         * @return 四舍五入后的结果
         */ 
        public static double round(double v,int scale){ 
     
            if(scale<0){ 
                throw new IllegalArgumentException( 
                    "The scale must be a positive integer or zero"); 
            } 
            BigDecimal b = new BigDecimal(Double.toString(v)); 
            BigDecimal one = new BigDecimal("1"); 
            return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
        } 
    } 


Js:
[javascript] view plain copy

    //除法函数,用来得到精确的除法结果  
    //说明: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)  
    //其它运算类似,就可以得到比较精确的结果。 
     
     
     
    //减法函数 
    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); 
    } 
分享到:
评论

相关推荐

    高精度JSBigDecimal运算

    在JavaScript(JS)中,由于其内置的数据类型限制,进行大数或高精度计算时,可能会遇到精度丢失的问题。这主要是因为JavaScript默认使用了浮点数(Number)类型,其精度只能保证到小数点后15位。这对于需要进行财务...

    Java Double 精度问题总结

    这种精度丢失的现象对于需要高精度计算的应用来说是一个常见的问题。本文将详细介绍Java中的 `double` 类型精度问题,并提供几种解决方法。 #### 一、Java Double 精度丢失的原因 1. **二进制表示限制**:`double`...

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

    5. **使用BigDecimal类**:在某些高级应用中,可以考虑使用类似Java的`BigDecimal`类,它提供了高精度的浮点数运算,但JavaScript原生并不支持,可能需要引入第三方库。 理解JavaScript浮点数计算的局限性并采用...

    JavaScript小数点精确计算

    6. **使用其他编程语言**:如果项目允许,可以使用像Java、Python等支持任意精度计算的语言进行计算,然后将结果传递给JavaScript。 总结来说,JavaScript的小数点精确计算需要开发者理解其底层机制,选择合适的...

    javascript版BigDecimal类库

    总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript精度问题的工具,使得在进行金融计算、科学计算或其他需要高精度计算的场合下,能够得到准确的结果。通过学习和应用这个库,开发者可以更好...

    js_bigdecimal_1_0_1.zip

    因此,"js_bigdecimal_1_0_1"库可能是将Java的BigDecimal概念移植到了JavaScript中,以便在Web开发中进行高精度计算。 这个库可能包含以下功能: 1. **大数加减乘除**:支持两个大数之间的加法、减法、乘法和除法...

    java计算方值.doc

    总的来说,Java中的二分法和黄金分割法是解决数值计算问题的有效工具,它们在寻找函数零点或近似值时具有各自的优点和适用场景。理解并掌握这些方法对于进行科学计算或工程问题的解决非常重要。

    卫星星下点轨迹的计算

    卫星星下点轨迹的计算是地球观测和通信领域中的一个重要概念,它涉及到天体力学、轨道动力学以及地球物理学等多个方面的知识。星下点是指卫星在其轨道上与地球表面最近的接触点,这个点的变化轨迹反映了卫星在地面上...

    java科学计算器,applet写的

    Applet的使用逐渐减少,因为现代Web应用程序更倾向于使用JavaScript和Web服务等技术,但学习和理解Java Applet对于理解早期Web应用的开发仍然具有一定的价值。 总结来说,这个Java科学计算器项目涵盖了Java GUI编程...

    16进制单精度(32位)浮点型转换器源码

    浮点型(Floating-Point)数据是用于表示带有小数部分的数字,通常用于科学计算和工程应用,因为它们可以表示很大的数值范围,但精确度相对较低。 单精度浮点数在IEEE 754标准中定义,占据32位,这32位分为三部分:...

    毕业设计: 计算机基于Cesium时空数据可视化后台Java SSM框架

    它基于WebGL技术,能够在浏览器中实现高精度的全球地形和卫星影像的实时渲染。Cesium提供了丰富的API和功能,如地理位置数据的加载、时间动态变化的数据展示、3D模型的添加等,非常适合进行时空数据的可视化。 ...

    java实现多种计算器功能包含表达式

    9. **数值精度**:对于浮点数计算,Java的`BigDecimal`类可以提供更高的精度,以避免因浮点数运算产生的误差。 10. **性能优化**:对于大型或复杂表达式,可能需要考虑优化计算性能。例如,可以预编译表达式,或者...

    人脸识别 | Java 实现 AI人工智能技术

    在本文中,我们将深入探讨如何使用Java来实现AI人工...通过深度学习模型和适当的工程实践,我们可以实现高精度的人脸识别,服务于多种应用场景。随着技术的不断进步,人脸识别将继续在我们的日常生活中发挥重要作用。

    计算机等测验考试二Java模拟测验考试.doc

    这篇文档是一个Java模拟测验考试,包含了选择题和填空题,主要涵盖了计算机科学和Java编程的基础知识。让我们逐个解析这些题目所涉及的关键知识点: 1. 数据的存储结构是数据间关系在计算机存储器中的实现,选项B...

    bignumber.js-master.zip

    总结来说,bignumber.js是JavaScript开发中处理大数和高精度计算的得力工具。它通过创建一个新的数据类型,解决了JavaScript原生Number类型的精度限制,确保了在各种计算场景下的结果准确性。无论是简单的加减乘除,...

    java 常用方法整理

    另外,`BigDecimal`类用于高精度的浮点数运算,避免了浮点数计算时可能出现的精度问题。 3. **IP地址处理**:Java的`InetAddress`类可以用来获取和解析IP地址。它提供了`getByName`方法用于根据主机名获取IP,以及`...

    Java编程复习资料

    资料还提到了Java的基本数据类型,包括布尔型、字符型、字节型、短整型、整型、长整型、浮点型和双精度浮点型。此外,讲解了引用、数组以及垃圾收集机制,指出Java的垃圾收集不同于C++的析构函数,主要用于自动回收...

    java基础总结大全(笔记).doc

    类型转换包括自动类型转换(从低精度到高精度)和强制类型转换(可能造成精度损失,从高精度到低精度)。 Java有三种技术架构:J2EE(Java 2 Enterprise Edition),适用于企业级应用开发;J2SE(Java 2 Standard ...

    TLE两行星历计算卫星轨道

    Norad公布的TLE两行星历的计算源码,采用SGP4和SDP4模型,亲测可用,添加了自己的代码,关键地方中文注释...本人找了很久,对于没有学过天体物理学测量学的,可以用这个,相当于一个黑盒子,计算精度很高,8分决定超值。

Global site tag (gtag.js) - Google Analytics