`
wooce
  • 浏览: 184744 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java的高精度大数字运算的问题

 
阅读更多

同事有以下高精度计算的java程序:

//计算 4/2^23*1000/6

                BigInteger bigInteger = new BigInteger("2");

                bigInteger = bigInteger.pow(23);

                BigDecimal b1 = new BigDecimal(4);

                b1 = b1.divide(new BigDecimal(bigInteger));

                Log.d("value:", b1 + "");

                b1 = b1.multiply(new BigDecimal(1000));

                Log.d("value:", b1 + "");

                b1 = b1.divide(new BigDecimal(6)); //在除6时报错

                Log.d("value:", b1 + "");

在执行b1 = b1.divide(new BigDecimal(6)); 这句时报错:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

同事问老杨, java的高精度浮点数都位数不够, 怎么办?

老杨建议,可以改用:

    b1 = b1.divide(new BigDecimal(6), , MathContext.DECIMAL128);

就可以了不会报错了。

其中位数可以按需要选择32, 64或128

可以参看:

http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext

 

老杨附带指出对于以下程序,也一样会报上面的java.lang.ArithmeticException: Non-terminating decimal expansion;的错, 这是因为除法除不尽,java就不知道到底要几位存储,必须要指定precision和RoundingMode才行:

BigDecimal a = new BigDecimal(1);

BigDecimal b = new BigDecimal(3);

a.divide(b) ;

参看java5的描述(java8的文档参见http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html):

When a MathContext object is supplied with a precision setting of 0 (for example, MathContext.UNLIMITED), arithmetic operations are exact, as are the arithmetic methods which take no MathContext object. (This is the only behavior that was supported in releases prior to 5.)

As a corollary of computing the exact result, the rounding mode setting of a MathContext object with a precision setting of 0 is not used and thus irrelevant. In the case of divide, the exact quotient could have an infinitely long decimal expansion; for example, 1 divided by 3.

If the quotient has a nonterminating decimal expansion and the operation is specified to return an exact result, an ArithmeticException is thrown. Otherwise, the exact result of the division is returned, as done for other operations.

 

 

0
2
分享到:
评论
1 楼 gaojingsong 2016-10-22  
http://gaojingsong.iteye.com/blog/2252294用字符串模拟两个大数相加

相关推荐

    ArithmeticUtils-高精度数学运算.pdf

    ArithmeticUtils是一个封装了多种高精度数学运算方法的工具类,它利用了BigDecimal的特性,提供了一系列的加、减、乘、除等运算方法。通过封装这些方法,ArithmeticUtils简化了在Java程序中进行高精度运算的过程。 ...

    高精度加减计算(链表)

    在计算机科学中,高精度计算是指处理非常大的数值,这些数值超过了标准数据类型(如int或float)所能表示的范围。这种计算通常涉及到数学、金融、科学计算等领域,需要精确到多位小数。本主题主要关注如何使用双向...

    Java Double 精度问题总结

    虽然 `double` 提供了相对较高的精度,但在涉及精确数学运算(特别是涉及到小数值)时,由于其内部采用二进制浮点数格式存储,仍会出现精度丢失的情况。这种精度丢失的现象对于需要高精度计算的应用来说是一个常见的...

    高精度JSBigDecimal运算

    总的来说,高精度JSBigDecimal运算库通过提供高精度的数学运算和控制精度的上下文环境,弥补了JavaScript在处理大数和高精度计算时的不足,使得开发者能够在JavaScript环境中进行更复杂的数学计算任务。在使用这些库...

    基于Java BigInteger类的大整数运算应用.pdf

    大整数运算是计算机科学和数学中一个重要的研究方向,许多应用场景都需要高精度的计算,例如精确到100位的小数的黄金分割系数计算、大素数问题、梅森素数问题等。Java提供的BigInteger类可以较好地解决这些问题。...

    超大数据,高精度加法和高精度阶乘运算

    总结一下,处理超大数据的加法和阶乘运算,我们可以利用字符串或数组来存储大数,并通过模拟基本的数学运算来实现。这种方法虽然简单易懂,但在效率上可能不如专门的大数运算库,如C++中的`<gmp>`库或Java中的`...

    高精度运算_高精度运算_

    综上所述,高精度运算是一门涵盖广泛计算理论和技术的学科,不仅涉及到基本的数学运算,还包括高效的算法设计、数据结构选择以及编程实现。理解和掌握这些知识点对于解决实际问题和开发相关应用至关重要。

    高精度加法减法乘法除法

    高精度计算不仅涉及基本的数学运算,还需要考虑效率、内存占用以及错误处理等问题。例如,当两个大数进行运算时,可能需要预先分配足够的空间来存储结果。此外,为了确保正确性,还需处理负数、溢出、边界条件等情况...

    Java的数学运算处理类讲解代码(BigDecimal、Math、Random、DecimalFormat类全部操作方法API)

    高精度计算:当需要进行高精度的数学计算时,如金融应用、科学计算等。 舍入规则控制:当需要精确控制数字舍入规则时,如货币计算、统计分析等。 随机数生成:当需要生成伪随机数以支持随机性需求时,如游戏开发、...

    带括号高精度计算器

    总之,【带括号高精度计算器】是一个具有高级数学运算能力的工具,其核心技术和难点在于大数运算的实现和高效处理括号运算。开发者可能运用了高级数据结构和算法,以及第三方库来增强功能。同时,软件工程方面的细节...

    Java编写的大数运算

    `BigInteger`提供了各种数学运算方法,如加法、减法、乘法、除法以及模运算等。此外,它还支持位操作,例如按位与、按位或、按位异或,这对于某些特定的计算场景非常有用。 另一方面,`BigDecimal`类则用于表示任意...

    第4章 数学运算

    数学运算是计算机科学的基础,无论是简单的算术运算(如加、减、乘、除)还是复杂的数学函数(如三角函数、指数和对数),它们都在解决问题时发挥着关键作用。例如,在游戏开发中,数学运算用于计算物体的位置、速度...

    JAVA中浮点数的运算

    `BigDecimal`类提供了丰富的API,如`add()`, `subtract()`, `multiply()`, `divide()`等,可以实现高精度的数学运算。在使用时,需要注意创建`BigDecimal`对象时传入的字符串参数,因为它们会直接影响到计算结果的...

    高精度计算1000阶乘

    ### 高精度计算1000阶乘 #### 背景介绍 在数学和计算机科学领域中,阶乘是一个非常重要的概念。阶乘是指所有小于及等于该数的正整数的乘积,通常表示为n!。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。当计算较大的...

    JAVA数学库colt-1.2.0

    - `colt`库的API清晰易用,遵循Java编程风格,使得开发者能够快速上手并进行高效的数学运算。 - 类和方法的命名规范,注释详尽,方便开发者理解和使用。 5. **应用场景** - 数据科学:在机器学习、深度学习、...

    大数 高精度 计算器 可编程计算器 表达式计算 π值 e值

    高精度计算通常涉及到高效的乘法、除法、加法和减法算法,以及对数、指数等数学运算的实现。 3. 可编程功能:这款计算器的一个独特之处在于它的可编程性。这意味着用户不仅可以输入简单的算术表达式,还可以编写小...

    基于字符串的高精度浮点计算实现

    在实际编程中,可以使用现有的库,如Python的`decimal`模块或Java的`BigDecimal`类,它们已经实现了这种高精度浮点计算。然而,如果你需要自定义的解决方案或特定的性能优化,那么自己实现这个过程是必要的。 总结...

    模拟数学基本运算

    如果我们要模拟更复杂的行为,比如矩阵运算、高精度计算或者自定义的数学函数,就需要编写自己的代码。 `MathFP.java`可能包含以下内容: 1. **浮点数运算**:可能包含了对浮点数进行加、减、乘、除的自定义实现,...

    ArithmeticUtils用于高精确处理常用的数学运算工具类

    ArithmeticUtils用于高精确处理常用的数学运算工具类 提供精确的加法运算 提供精确的减法运算 提供精确的乘法运算 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位,以后的数字四舍五入 ...

    JAVA写的标准数学计算器

    在实现计算逻辑时,Java的`java.math`包提供了`BigDecimal`类,它支持精确的浮点运算,避免了常规`double`类型可能存在的精度问题。对于更复杂的数学运算,如三角函数、对数等,可以使用`Math`类或者`StrictMath`类...

Global site tag (gtag.js) - Google Analytics