`
caibinghong
  • 浏览: 148876 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

JAVA 及 js 浮点数精确计算

阅读更多

 

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的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用: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);
}

//减法函数,用来得到精确的减法结果
//说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSubtr(arg1,arg2)
//返回值:arg1减去arg2的精确结果
function accSubtr(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类型增加一个subtr 方法,调用起来更加方便。
Number.prototype.subtr = function (arg){
return accSubtr(arg,this);
}

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

分享到:
评论

相关推荐

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

    在JavaScript编程中,...理解JavaScript浮点数计算的局限性并采用适当的策略,可以有效地应对和预防这类问题,保证代码的准确性和可靠性。在开发过程中,始终要对浮点数的运算结果保持警惕,并进行适当的验证和处理。

    JavaScript小数点精确计算

    首先,我们来理解JavaScript浮点数计算的原理。在JavaScript中,所有数字都是以64位的二进制浮点数形式存储的。由于二进制无法精确表示所有十进制小数,因此在转换过程中会出现误差,例如0.1 + 0.2 !== 0.3。这种...

    js浮点数处理转精确值

    但在编写Web应用时,我们可能需要在服务器端使用Quartz来调度执行一些需要精确计算的任务,比如定期更新数据库中的浮点数数据。 对于需要高精度计算的场景,JavaScript社区也提供了许多库,如`decimal.js`或`big...

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

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

    保留浮点数的n位小数;

    在实际应用中,如财务计算、科学计算或数据可视化,精确控制浮点数的显示格式至关重要。 标题中的“保留浮点数的n位小数”指的是将浮点数四舍五入或截断到指定的小数位数。这通常涉及到数字的字符串格式化或者使用...

    javascript版BigDecimal类库

    本文将详细介绍JavaScript版的`BigDecimal`类库,以及如何在JavaScript环境中实现精确计算。 JavaScript版的`BigDecimal`类库是基于Java原版`BigDecimal`的改编,旨在提供与Java版本相似的功能,以支持大整数和任意...

    js_bigdecimal_1_0_1.zip

    总的来说,"js_bigdecimal_1_0_1.zip"为JavaScript开发者提供了一种解决大数精度问题的工具,使得在Web应用中进行精确计算成为可能。对于需要处理大量财务数据或需要精确计算的项目,这是一个非常有价值的库。

    Java Double 精度问题总结

    #### 四、JavaScript 中的精度问题及解决方法 除了Java之外,在JavaScript中也会遇到类似的精度问题。一种常见的解决方案是使用 `Math.round` 函数来四舍五入结果。 ```javascript function formatFloat(src, pos)...

    JAVA的70各问题

    如需精确计算,可使用`BigDecimal`类。 14. 获取游标位置:在处理结果集`ResultSet`时,`getRow()`返回当前行数,`isFirst()`、`isBeforeFirst()`、`isLast()`和`isAfterLast()`用于判断当前位置。 15. 禁止表单...

    高精度JSBigDecimal运算

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

    bignumber.js-master.zip

    在JavaScript中,处理大数(超过Number.MAX_SAFE_INTEGER,即2^53 - 1的数值)时,可能会遇到精度丢失的问题,这对于需要精确计算的场景,如金融计算、科学计算等,是不可接受的。为了解决这一问题,开发者们通常会...

    JAVA常见数类型大小.docx

    JavaScript的Number类型可以表示整数和浮点数,且在内存中都是以双精度浮点数(64位)存储,因此没有单独的byte、short、int、long数据类型。JavaScript的字符串是可变的,每个字符的大小取决于字符编码,可以是单...

    java(20211007021206).pdf

    若需要精确计算,可以使用`strictfp`关键字遵循IEEE 754标准。 14. **数据库游标位置**: 在处理数据库结果集(ResultSet)时,`getRow()`方法可以获取当前指针所在行数,还有`isFirst()`, `isBeforeFirst()`, `...

    计算器--简单的加减乘除

    在大多数编程语言中,如JavaScript、Python或Java,浮点数(例如,`float`或`double`类型)是用于表示小数的,但它们并非完全精确。这是因为浮点数在计算机内部是以二进制形式存储的,某些十进制小数无法精确地转换...

    java面试题

    为获得精确计算,可以使用`strictfp`关键字,或者使用`BigDecimal`类进行高精度计算。 14. **游标位置**:在处理结果集(ResultSet)时,可以使用`getRow()`方法获取当前行数,以及`isFirst()`, `isBeforeFirst()`,...

    实用浮点数

    浮点数在编程语言中,如JavaScript、Python、Java等,都得到了深入的应用。本篇文章将详细探讨“实用浮点数”这一主题,以及与HTML相关的实践应用。 浮点数在计算机科学中通常用来表示带有小数的数值,比如3.14或者...

    java 70个问答

    13. **浮点数运算精确度问题:** - 浮点数运算可能存在精度误差,对于需要高精度运算的场景,可以使用`BigDecimal`类或`strictfp`关键字确保结果的一致性。 14. **数据库游标位置操作:** - 在使用JDBC时,可以...

    青麦丨Java本数据类型.docx

    double 是浮点数的默认类型,精度高于 float,但同样不能精确表示某些数值。默认值是 0.0d。 7. **boolean**: 表示逻辑值,仅有两个可能的取值:true 和 false。它主要用于标志和条件判断,不用于数值计算。默认值...

    70个Java面试题含答案.pdf

    Java中的`float`和`double`类型存在精度问题,由于它们是基于二进制浮点表示,可能导致不精确的计算结果。若需高精度计算,可以使用`java.math.BigDecimal`类。 14. **游标位置**: 在处理结果集(ResultSet)时...

Global site tag (gtag.js) - Google Analytics