`
wooce
  • 浏览: 180580 次
  • 性别: 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用字符串模拟两个大数相加

相关推荐

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

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

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

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

    简易计算器(Java Swing实现)

    /** * Java计算器 * chishaxie * 支持中缀表达式运算(可以算一个很长的数学表达式) * 支持高精度浮点数运算 * 支持按钮和键盘同步监听 * 支持错误处理并提示 */ 可以试试算65535的阶乘啰(等待1分钟左右)

    详谈javascript精度问题与调整

    一个经典的问题: 0.1+0.2==0.3 答案是:false 因为:0.1+0.2=0.30000000000000004 ...1.32位的浮点数(单精度),最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。 浮点数的表现形式: x=(-1)^S*

    ACM/ICPC模板

    --高精度模板 --RMQ --改点堆优化的dijkstra算法 --快速付利叶变换 --稳定婚姻问题 --SPFA(最短路快速算法) // thanks to love8909 几何相关 --初等几何学 --多边形几何 --几种凸包算法 --半平面交算法 --旋转卡壳...

    QLExpress:QLExpress是用于Java平台的功能强大,轻量级,动态的语言,旨在提高开发人员在不同业务场景中的工作效率

    由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神...

    Fraction:适用于Java和Android的简单分数库

    分数是一个不变的类,用于以离散状态存储有理数值,并自动减少分数(例如2/4变为1/2),以及其他分数对象和原始数值之间的基本数学运算。 该库在内部使用BigInteger来存储值,以确保精度并防止在处理大分子和分母时...

    javasin函数源码-FixPointCS:一个快速、多语言、多精度的定点库!

    旨在提供尽可能强大和高效的核心数学运算,同时保持 API 简单以保持与多种语言的兼容。 它旨在成为更高级别数学库的构建块,而不是直接从应用程序代码中使用。 为方便起见,FixPointCS 也包含一个更高级别的数学库...

    22春“计算机科学与技术”专业《计算方法》在线作业含答案参考10.docx

    高精度计算时可以用字符串来存储运算结果。( ) A.错误 B.正确 参考答案:B 5. 字符串的结束标记是( )。 A.0' B.' ' C.'\0' D.'\n' 参考答案:C 22春"计算机科学与技术"专业《计算方法》在线作业含答案参考10全文共4...

    计算机软件水平考试软件设计师考试大纲与培训指南(2009版)

    (7) 掌握C程序设计语言,以及C++、Java中的一种程序设计语言; (8) 熟悉软件工程、软件过程改进和软件开发项目管理的基础知识; (9) 掌握软件设计的方法和技术; (10) 了解信息化、常用信息技术标准、安全性,以及...

    C++大学教程,一本适合初学者的入门教材(part2)

    1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 1.16 简单程序:两个整数相加 1.17 内存的...

    C++大学教程,一本适合初学者的入门教材(part1)

    1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 1.16 简单程序:两个整数相加 1.17 内存的...

    若干源程序资料12.rar

    2012-06-11 21:09 27,688 用单片机制作的高精度数显计数器.rar 2012-06-11 21:10 9,654 用单片机实现公历到农历换算的新方法.zip 2012-06-11 21:08 2,318 用英文单词模拟数学计算代码.txt 2012-06-11 21:06 13,654 ...

    C++大学教程

    1.9 Java、Internet与万维网--------------------------------------------7 1.10 其它高级语言------------------------------------------------------8 1.11 结构化编程-----------------------------------...

Global site tag (gtag.js) - Google Analytics