`
_Jason_
  • 浏览: 42865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决double类型不能精确计算问题~

阅读更多
        第一篇技术贴,朝着技术宅方向努力着,希望自己也能像社区里的各种牛人一样,成为一牛,多余的都是废话了,直接上问题。
        起源是我们科学计算课留的作业,用程序计算lagrange插值(拉格朗日插值),但是当我程序逻辑写好了,进行初步测试的时候发现,错误原因在于double类型无法精确计算,额,我用的都是double类型,这样人如何是好,随后请教大神,知晓了Java为double计算封装的类BigDecimal.下面是为了方便应用写好的方法,留着以后用:
package cn.edu.cust.func;
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();
    }
};
注:源代码不是本人的,但是都是为了学习,为了大伙方便解决问题啦~
分享到:
评论

相关推荐

    double类型,精确的数据运算

    在提供的标题“double类型,精确的数据运算”中,我们可以推测这是一个针对`double`类型进行精确计算的类包。这类包通常通过内部使用大整数运算或者特殊的数据结构来存储和操作浮点数,以达到比内置`double`类型更高...

    iOS 解决floatValue,doubleValue等计算不精确问题,一句话解决精确计算,精确比较

    通过以上方法,我们可以有效地解决iOS开发中浮点数计算不精确的问题。当然,具体选择哪种策略取决于你的应用场景和对精度的要求。在处理涉及金钱或其他要求严格精确性的数据时,推荐使用`Decimal`。而在大多数常规...

    Java 精确计算-double-float-String

    标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...

    iOS NSDecimalNumber解决数值计算不精确问题,一句话解决精确计算,精确比较

    标题和描述中提到的"iOS NSDecimalNumber解决数值计算不精确问题,一句话解决精确计算,精确比较",正是针对这一问题给出的一种解决方案。NSDecimalNumber是Apple提供的一个类,用于处理高精度的十进制数值,可以...

    Java Double 精度问题总结

    本文将详细介绍Java中的 `double` 类型精度问题,并提供几种解决方法。 #### 一、Java Double 精度丢失的原因 1. **二进制表示限制**:`double` 类型基于IEEE 754标准的双精度格式,使用64位来表示一个浮点数。...

    解决vb中数值型变量长度超过15位后不能精确计算的方法之一

    在VB(Visual Basic)编程中,数值型...通过使用Decimal或BigInteger等类型,我们可以有效地解决VB中15位以上数值的精确计算问题。同时,源代码和工程文件的分享有助于开发者之间进行学习和交流,共同提升编程技能。

    double类型精度丢失;double转换到64位整数

    标题提到的“double类型精度丢失;double转换到64位整数”就涉及到这一关键概念。 精度丢失通常发生在以下几种情况: 1. **浮点数存储**: 浮点数在计算机内部是用二进制表示的,不是所有的小数都能精确地表示为...

    double 计算过程出现的误差

    在计算机编程领域,尤其是涉及到数值运算时,经常会遇到由于浮点数表示不精确而导致的计算误差问题。本篇文章将深入探讨在C#、SQL Server以及Oracle数据库中使用`double`类型进行计算时可能出现的误差,并通过具体的...

    test2_JavaDouble类型比较大小_java编程_

    描述"Java Double 类型比较大小 不能直接使用 &gt;0 "提醒我们,直接使用大于(`&gt;`)或小于(`)符号进行比较可能不准确。这是因为浮点数计算时的舍入误差。例如,`0.1 + 0.2`理论上应该等于`0.3`,但在Java中,由于...

    详解iOS之关于double/float数据计算精度问题

    iOS 中 double/float 数据计算精度问题是一个常见的问题,但我们可以使用 NSDecimalNumber 类型的对象来解决这个问题。高精度计算是非常重要的,NSDecimalNumber 提供了多种高精度计算方法,例如 ...

    Java Double相加出现的怪事

    这说明 Java 中的浮点数类型 float 和 double 不能进行精确的运算。 四舍五入: 我们的第一个反应是做四舍五入。我们可以使用 Math 类中的 round 方法,但是这个方法不能设置保留几位小数。我们可以使用以下代码来...

    解析Java中的精确计算方法.pdf

    "Java中的精确计算方法" Java语言中,浮点数是一种常用的数值类型,但是它并不是非常精确的。浮点数的计算结果可能会出现舍入误差,导致结果不符合预期。这种情况在金融计算、科学计算等领域中尤其重要。 IEEE 754...

    程序中两个Double类型相加出现误差的解决办法

    在编程中,尤其是在涉及到金融计算或者精确度要求高的领域,我们常常会遇到浮点数(如Double类型)相加时出现误差的问题。这是因为计算机在表示和计算浮点数时采用了二进制,而十进制的浮点数转换为二进制可能会导致...

    解决java数值范围以及float与double精度丢失的问题

    在进行精确计算时,应该避免使用float和double类型,而应该使用BigDecimal类型或高精度的浮点数库。 四、结论 Java中的数值范围和浮点数精度问题是非常重要的知识点。在进行开发时,需要了解Java中的数值范围和...

    计算机精度问题(Double)

    解决精度问题的方法有很多,如使用更高精度的数据类型(如Java中的`BigDecimal`),或者使用特定的算法进行浮点数比较。在进行浮点数计算时,可以设定一个容差值(epsilon),只要两个数的差的绝对值小于这个容差,...

    Java中实现浮点数的精确计算

    - 使用`double`参数的构造器可能会导致不可预测的结果,因为`double`类型的值本身可能就存在精度问题。 - 使用`String`参数的构造器则可以避免这些问题,因为它不会受到`double`类型精度的影响。 ```java ...

    Java用BigDecimal解决double类型相减时可能存在的误差

    以下是一些使用`BigDecimal`进行精确计算的方法: 1. **相减(Subtract)**: 示例代码中的`sub(Double d1, Double d2)`方法展示了如何使用`BigDecimal`来进行减法运算。首先,将`Double`类型的参数转换成`...

    java_double_精度

    Java 中的双精度浮点数(double)类型在进行运算时经常出现精度丢失的问题,这是由于双精度浮点数在计算机内部的存储方式所致。双精度浮点数使用 64 位二进制数来存储小数,然而这种存储方式会导致某些小数无法精确...

    C# 按照IEEE 754标准对Float和Double类型进行转换

    由于浮点数的有限精度,某些特定的十进制数字可能无法精确表示为二进制浮点数,这可能导致计算结果出现微小的误差。此外,过大或过小的数值可能会导致指数溢出,从而产生无穷大或无穷小值。 在实际编程中,`float`...

    java中double类型运算结果异常的解决方法

    在Java编程语言中,`double`类型用于表示浮点数,它在大多数计算中能...这种方法虽然会增加代码的复杂性,但在需要精确计算的场景下是必要的。在进行金融、科学计算或其他需要高精度的运算时,推荐使用`BigDecimal`。

Global site tag (gtag.js) - Google Analytics