`

Java中数值计算的精度问题

阅读更多

《Effective Java》这本书中提到,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal,一共有4个够造方法,如果需要精确计算,非要用String来够造BigDecimal不可!

 

以下内容来自:http://leojose.iteye.com/blog/387327

 

Java中的基本类型float有着很严重的精度缺失问题,这个我主要是通过java.math.BigDecimal来弥补,但BigDecimal毕竟是一个类,有着对象的创建销毁等繁琐的事情,况且Java中类本身没有destroy()方法,这就把一切对象的彻底销毁后内存的回收,变成了一个不可测的变数,纵使你调用了system.gc(),但此方法的执行时机却又是未知的;所以这就要求程序员要尽可能少的创建对象(当然这还与java本身的确非常消耗内存有关),当对象一旦不用,尽可能的置为null,否则当程序运行几次后就会发现内存占有率高居不下,甚至有导致死机可能。

 

BigDecimal还有一点要引起注意的是,两个对象即使值确实相等,但它们相比较时也可能会引起不等的结果,举个例子如:
BigDecimal testA = new BigDecimal(200);

BigDecimal testB = new BigDecimal(200.00);

 

也许你认为 testA.equals(testB)==true, 但结果是false。然而 testA.toString().equals(testB.toString())==true 却是正确的。这是因为testB.toString()的值为200,在进行类型转换时,它已把小数点后的两个零去掉了。

 

为了解决这个问题,我通常的做法是将它们的小数点位数补起后再进行比较,这样是肯定不会出错了。

testA = testA.setScale(2,5);

testB = testB.setScale(2,5);

 

此时testA.equals(testB)==true。

 

当然了你可以根据需要将小数点位数设多或设置少一点。

 

setScale(int,int)中

第一位数为设置的小数点位数,

第二位是四舍五入的界值,你可以随意修改,如6,就是大于等于6是就进位。

 

还有testA = testA.setScale(2,5)这种写法在用BigDecimal时将会一直出现,因为它必须要通过给自身返回值来替代已经存在的值,如果你这样写testA.add(new BigDecimal(0)),那你会发现你的结果并不是想象中的200,而是0。

 

当然加减乘除都是一样的。至于刚才的比较为何不用testA.floatValue(),当然还是因为会造成精度丢失的缘故了,当然如果你的小数位数不超过5位的话,也是可以的,如果是超过5位,那就和第五位的值有关了(因为它仅保留五位小数),显示如果第五位大于等于五,即使第六位为零,也会在第五位上加一,否则后面的只会被截掉!


说到这里,忽然想起javascript中的尾数和精度问题,javascript中有一个方法“toFixed()”,这个方法就是用来截取小数点后尾数的长度的。例:var a = 343.12345465;var b = b.toFixed(4);这样b小数点后的尾数就是4位了,注意,它是按照四舍五入进行截取的。

分享到:
评论

相关推荐

    java数值计算算法示例程序

    这个“java数值计算算法示例程序”压缩包提供了丰富的代码示例,帮助开发者深入理解并掌握如何在Java中实现各种数值计算方法。 首先,我们要了解Java在数值计算中的基本概念。Java作为一种强大的面向对象的编程语言...

    Java数值计算算法编程

    总结,Java数值计算算法编程涵盖了基础数据类型与运算、数学库的使用、高精度计算、迭代与递归、数据结构应用、矩阵运算、并发处理以及面向对象设计等多个方面。理解并掌握这些知识点,能够帮助开发者在Java环境中...

    关于java的数值精度

    java程序中数值的精度问题,float、double容易产生精度数值问题,不适合精度计算,而bigdecimal正好解决这一问题

    java数值计算算法编程

    Java数值计算算法编程是计算机科学中的一个重要领域,它涉及到如何使用Java语言进行高效且精确的数学运算。在Java中,数值计算涵盖了广泛的算法和技术,包括基本的算术运算、复杂数学函数、线性代数、微积分、概率...

    数值计算 数值分析 实验 java

    总的来说,这个“数值计算 数值分析 实验 java”课程结合了理论与实践,让学生在实践中学习和巩固数值计算的知识,通过编写Java代码,提升他们的编程能力和问题解决能力,为未来在IT领域的职业生涯打下坚实的基础。

    Java Double 精度问题总结

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

    Java POI读取excel中数值精度损失问题解决

    Java POI 读取 Excel 中数值精度损失问题解决 Java POI 读取 Excel 中数值精度损失问题解决是指在使用 Java POI 读取 Excel 文件时,遇到数值精度损失的问题。这种问题的出现是因为 Excel 中的数值单元格在读取时,...

    Java写的数值分析中的一些程序

    - **并行计算**:利用Java的多线程特性,提高数值计算的效率。 这些Java程序可能没有注释,但是通过代码结构、函数调用以及算法的常见模式,可以推断出它们的功能和用途。对于学习者来说,这提供了一个很好的实践...

    java数值计算

    Java数值计算中,浮点环境是理解数值运算的关键。在Sun Studio11中,数值计算的基石是基于IEEE算法模型,这一模型定义了浮点数的存储和运算规则。IEEE算法,即Institute of Electrical and Electronics Engineers...

    Java 常用数值算法集

    在Java中,基础的数值计算涉及浮点数运算、整数运算以及复数运算。浮点数运算通常涉及小数计算,Java提供了`float`和`double`两种类型,其中`double`精度更高。整数运算主要由`int`, `long`, `short`, `byte`等类型...

    Java常用数值算法集代码

    在这个"Java常用数值算法集代码"中,我们很显然会探讨一系列在Java编程中用于处理数值计算和算法实现的关键技术。这些算法通常包括但不限于数学计算、线性代数、统计分析、优化问题、图形图像处理以及科学计算等多个...

    java常用数值算法集破解版(能看的电子书)

    13. **错误与异常处理**:在数值计算中,可能会遇到除零错误、溢出等问题。了解如何处理这些异常对于编写健壮的代码至关重要。 这个“Java常用数值算法集”电子书可能涵盖了上述部分或全部知识点,是Java开发者提升...

    java数值计算实验题目

    Java数值计算实验旨在提升编程者在算法和编程技术方面的技能,尤其关注数值处理。下面将逐一解析提供的实验题目,深入探讨相关知识点。 实验1:高斯消元法 这是一种求解线性方程组的经典算法,通过行变换将系数矩阵...

    Java实现的浮点类的精确计算

    为了克服这个问题,Java提供了`java.math.BigDecimal`类,它提供了一种方法来进行高精度的十进制计算,从而避免浮点运算中的精度问题。 描述中的"Java实现的浮点类的精确计算"很可能就是指一个自定义的工具类,该类...

    Java常用数值算法集

    7. **数值稳定性和误差分析**:理解算法的误差来源和如何保持计算结果的精度,是数值计算中的核心概念。 8. **复数运算**:在信号处理和电路分析等领域,复数运算经常出现。 9. **傅里叶变换**:包括离散傅里叶...

    计算机精度问题(Double)

    本文主要探讨的是“计算机精度问题”,特别是关于双精度浮点数(Double)的表示和计算中可能出现的问题。 双精度浮点数(Double)在计算机中通常按照IEEE 754标准进行存储和运算,它提供了大约15到16位的有效数字,...

Global site tag (gtag.js) - Google Analytics