`
小熊座
  • 浏览: 6851 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Java的浮点精确计算

阅读更多
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中的浮点数精确计算主要是通过`java.math.BigDecimal`类来实现的,而"Java实现的浮点类的精确计算"则可能是一个自定义工具类,封装了`BigDecimal`的操作,以提供方便、准确的浮点数计算服务。...

    java精确计算浮点数工具类

    Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是...该类提供了加减乘除四则运算的精确计算方式.在你处理数据的工程中,该类可以给你意想不到的惊喜

    java计算器(整型+浮点型)

    浮点型更精确但占用更多内存,而整型则相对节省资源。 2. **运算符**:Java支持算术运算符(+,-,*,/,%),用于执行加法、减法、乘法、除法和取余操作。对于浮点型计算,除法运算会自动产生浮点结果,即使两个...

    Java数值计算算法编程

    Java的数据类型提供了精确的数值存储和运算,但需要注意浮点型数据在进行计算时可能会有精度损失。 在Java中,基础的算术运算符如+、-、*、/和%用于执行基本的数学操作。对于复杂的数值计算,我们可以利用Java的...

    Java中精确的浮点运算操作示例

    为了解决基本数据类型浮点数不能进行精确计算的问题,Java 中提供了 `java.math.BigDecimal` 类,其提供浮点数的精确计算功能。与 `BigInteger` 类相同,其运算操作均使用方法调用完成。 使用 `BigDecimal` 类可以...

    java数值计算算法编程

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

    16进制单精度(32位)浮点型转换器源码

    浮点型(Floating-Point)数据是用于表示带有小数部分的数字,通常用于科学计算和工程应用,因为它们可以表示很大的数值范围,但精确度相对较低。 单精度浮点数在IEEE 754标准中定义,占据32位,这32位分为三部分:...

    J2ME浮点库MathFP

    2. **浮点运算**:浮点运算在移动设备上的性能问题,以及MathFP如何提供高效且精确的浮点计算服务。 3. **MathFP库功能**:掌握库提供的各种数学函数,例如三角函数、指数、对数、平方根等,以及如何在J2ME程序中...

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

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

    解决javascript中的浮点数计算不精确问题

    在JavaScript编程中,浮点数计算不精确是一个常见的问题,源于其内部的二进制浮点数表示方式。本文将深入探讨这个问题,并提供解决方案。首先,我们要理解为什么会出现这种不精确性。 JavaScript遵循IEEE 754标准来...

    Java基本数据类型---浮点类型.pdf

    需要注意的是,由于浮点数的二进制表示方式,有些十进制的小数在转换为二进制时无法精确表示,这可能导致浮点计算时出现不精确的结果。因此,如果对精度要求极高,应避免使用浮点类型,转而使用 `BigDecimal` 类进行...

    java基础f复习

    - 浮点类型的精度有限,不适合用于需要精确计算的场合。 - **字符类型**:使用单引号表示,采用Unicode编码,每个字符占用两个字节。 - **布尔类型**:只有两种值`true`和`false`。 - **引用数据类型**:包括类...

    Java与MySQL中小数保存问题解析.pptx.pptx

    尽管double的精度较高,但在某些情况下仍然可能不足以满足精确计算的需求。此外,Java还支持科学计数法,这种表示方式可以有效地表示非常大或非常小的数值,例如3.4E-2代表0.034。 MySQL数据库则提供了多种小数类型...

    复习java基础.pdf

    1. 浮点型数据运算与精度问题:在Java中,浮点型数据(如`float`和`double`)在计算时可能会出现微小的误差。例如,`if(a+1.0=4.0)`这样的判断可能由于浮点运算的精度问题而导致误判。为避免此类问题,开发者应尽量...

    How Java’s Floating-Point Hurts Everyone Everywhere

    摘要、概述、两个残酷的误解、复杂的算术类示例、矩阵乘法加速的重要性、自我约束、可重复性与可控性、Java试图修正无需修正的浮点问题、异常处理、代数补全、缺乏标志位带来的危险性、关于浮点运算的误解、灾难性...

    Java实现IEE754 Float类型数据

    ### Java实现IEEE 754 Float类型数据解析 ...通过对浮点数结构的深入理解,我们可以更准确地处理和表示浮点数,在进行科学计算或数据处理时提供更精确的结果。希望本文能够帮助读者更好地理解和应用IEEE 754标准。

    java解惑 PDF版

    因此,文档建议在需要精确计算货币的场景中使用整数类型,例如使用分作为单位进行计算。 ### 性能考虑与位操作符的使用 对于那些在性能敏感环境中工作、需要频繁进行奇偶判断的开发者而言,使用位操作符AND(&)...

Global site tag (gtag.js) - Google Analytics