Java在做浮点运算的时候由于float和double容易丢失精度, 所以引入了BigDecimal来做精确的运算,它是不可变的任意精度的10进制数。
/** * BigDecimal * public BigDecimal(double val) 不推荐,可能不准确 * Translates a double into a BigDecimal which is the exact decimal representation of the double's binary floating-point value. The scale of the returned BigDecimal is the smallest value such that (10scale × val) is an integer. * Notes: * The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding. * The String constructor, on the other hand, is perfectly predictable: writing new BigDecimal("0.1") creates a BigDecimal which is exactly equal to 0.1, as one would expect. Therefore, it is generally recommended that the String constructor be used in preference to this one. * When a double must be used as a source for a BigDecimal, note that this constructor provides an exact conversion; it does not give the same result as converting the double to a String using the Double.toString(double) method and then using the BigDecimal(String) constructor. To get that result, use the static valueOf(double) method. * Parameters: * val - double value to be converted to BigDecimal. * * public BigDecimal(String val) 推荐,准确 */ package math; import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimalDemo { /** * @param args */ public static void main(String[] args) { // float和double在计算时有时不准确,要准确计算应该使用BigDecimal类 // System.out.println(0.01 + 0.09);//0.09999999999999999 // System.out.println(1 - 0.32);//0.6799999999999999 // System.out.println(1.015 * 100);//101.49999999999999 // System.out.println(1.301 / 100);//0.013009999999999999 // 使用BigDecimal类 BigDecimal bd1 = new BigDecimal("0.01"); BigDecimal bd2 = new BigDecimal("0.09"); System.out.println("add:" + bd1.add(bd2)); System.out.println("--------------------"); BigDecimal bd3 = new BigDecimal("1"); BigDecimal bd4 = new BigDecimal("0.32"); System.out.println("subtract:" + bd3.subtract(bd4)); System.out.println("--------------------"); BigDecimal bd5 = new BigDecimal("1.015"); BigDecimal bd6 = new BigDecimal("100.0"); System.out.println("multiply:" + bd5.multiply(bd6)); System.out.println("--------------------"); BigDecimal bd7 = new BigDecimal("1301"); BigDecimal bd8 = new BigDecimal("100.0"); System.out.println("divide:" + bd7.divide(bd8)); System.out.println("--------------------"); BigDecimal bd9 = new BigDecimal("1301.00"); BigDecimal bd10 = new BigDecimal("100.0"); System.out.println("divide,round mode ceiling:" + bd9.divide(bd10, 1, RoundingMode.HALF_UP)); System.out.println("--------------------"); } }
结果:
add:0.10
--------------------
subtract:0.68
--------------------
multiply:101.5000
--------------------
divide:13.01
--------------------
divide,round mode ceiling:13.0
--------------------
相关推荐
总结一下,Java中的浮点数精确计算主要是通过`java.math.BigDecimal`类来实现的,而"Java实现的浮点类的精确计算"则可能是一个自定义工具类,封装了`BigDecimal`的操作,以提供方便、准确的浮点数计算服务。...
Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是...该类提供了加减乘除四则运算的精确计算方式.在你处理数据的工程中,该类可以给你意想不到的惊喜
浮点型更精确但占用更多内存,而整型则相对节省资源。 2. **运算符**:Java支持算术运算符(+,-,*,/,%),用于执行加法、减法、乘法、除法和取余操作。对于浮点型计算,除法运算会自动产生浮点结果,即使两个...
Java的数据类型提供了精确的数值存储和运算,但需要注意浮点型数据在进行计算时可能会有精度损失。 在Java中,基础的算术运算符如+、-、*、/和%用于执行基本的数学操作。对于复杂的数值计算,我们可以利用Java的...
为了解决基本数据类型浮点数不能进行精确计算的问题,Java 中提供了 `java.math.BigDecimal` 类,其提供浮点数的精确计算功能。与 `BigInteger` 类相同,其运算操作均使用方法调用完成。 使用 `BigDecimal` 类可以...
Java数值计算算法编程是计算机科学中的一个重要领域,它涉及到如何使用Java语言进行高效且精确的数学运算。在Java中,数值计算涵盖了广泛的算法和技术,包括基本的算术运算、复杂数学函数、线性代数、微积分、概率...
浮点型(Floating-Point)数据是用于表示带有小数部分的数字,通常用于科学计算和工程应用,因为它们可以表示很大的数值范围,但精确度相对较低。 单精度浮点数在IEEE 754标准中定义,占据32位,这32位分为三部分:...
2. **浮点运算**:浮点运算在移动设备上的性能问题,以及MathFP如何提供高效且精确的浮点计算服务。 3. **MathFP库功能**:掌握库提供的各种数学函数,例如三角函数、指数、对数、平方根等,以及如何在J2ME程序中...
在实际编程中,可以使用现有的库,如Python的`decimal`模块或Java的`BigDecimal`类,它们已经实现了这种高精度浮点计算。然而,如果你需要自定义的解决方案或特定的性能优化,那么自己实现这个过程是必要的。 总结...
在JavaScript编程中,浮点数计算不精确是一个常见的问题,源于其内部的二进制浮点数表示方式。本文将深入探讨这个问题,并提供解决方案。首先,我们要理解为什么会出现这种不精确性。 JavaScript遵循IEEE 754标准来...
需要注意的是,由于浮点数的二进制表示方式,有些十进制的小数在转换为二进制时无法精确表示,这可能导致浮点计算时出现不精确的结果。因此,如果对精度要求极高,应避免使用浮点类型,转而使用 `BigDecimal` 类进行...
- 浮点类型的精度有限,不适合用于需要精确计算的场合。 - **字符类型**:使用单引号表示,采用Unicode编码,每个字符占用两个字节。 - **布尔类型**:只有两种值`true`和`false`。 - **引用数据类型**:包括类...
尽管double的精度较高,但在某些情况下仍然可能不足以满足精确计算的需求。此外,Java还支持科学计数法,这种表示方式可以有效地表示非常大或非常小的数值,例如3.4E-2代表0.034。 MySQL数据库则提供了多种小数类型...
1. 浮点型数据运算与精度问题:在Java中,浮点型数据(如`float`和`double`)在计算时可能会出现微小的误差。例如,`if(a+1.0=4.0)`这样的判断可能由于浮点运算的精度问题而导致误判。为避免此类问题,开发者应尽量...
摘要、概述、两个残酷的误解、复杂的算术类示例、矩阵乘法加速的重要性、自我约束、可重复性与可控性、Java试图修正无需修正的浮点问题、异常处理、代数补全、缺乏标志位带来的危险性、关于浮点运算的误解、灾难性...
### Java实现IEEE 754 Float类型数据解析 ...通过对浮点数结构的深入理解,我们可以更准确地处理和表示浮点数,在进行科学计算或数据处理时提供更精确的结果。希望本文能够帮助读者更好地理解和应用IEEE 754标准。
因此,文档建议在需要精确计算货币的场景中使用整数类型,例如使用分作为单位进行计算。 ### 性能考虑与位操作符的使用 对于那些在性能敏感环境中工作、需要频繁进行奇偶判断的开发者而言,使用位操作符AND(&)...