`
greemranqq
  • 浏览: 975516 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

java 中浮点类型常用计算方法

 
阅读更多

JAVA 浮点类型的计算,我们知道会出现失精的问题,如果程序中经常使用,我的做法是,写一个工具类,专门处理类似问题。

 

	/**
	 * 
	 * @Description:两个double类型相加,返回Double
	 * @createBy:qiqiang ran
	 * @createdate:2012-3-23
	 * @param double d1
	 * @param double d2
	 * @return double
	 */
	public static double doubleAdd(double d1, double d2) {
		BigDecimal a1 = new BigDecimal(d1);
		BigDecimal b1 = new BigDecimal(d2);
		return a1.add(b1).doubleValue();
	}

 

那么用BigDecimal 就完全可以解决了吗?我找到这样一句话:
Note: the results of this constructor can be somewhat unpredictable.
One might assume that new BigDecimal(.1) is exactly equal to .1, 
but it is actually equal to .1000000000000000055511151231257827021181583404541015625. 
This is so because .1 cannot be represented exactly as a double (or, for that
matter, as a binary fraction of any finite length). 
Thus, the long value that is being passed in to the constructor is not exactly 
equal to .1, appearances nonwithstanding. 

The (String) constructor, on the other hand, is perfectly predictable: 

new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, 

it is generally recommended that the (String) constructor be used in preference 

to this one.(转《Effective Java》

我了解了一下,BigDecimal 有4个构造方法,具体的大家可以去看看,这里强调了是着两个:
BigDecimal(String val){...};
BigDecimal(double val){...};
而我们通常使用的是 构造double val,但是从刚才那段说明中得知:字符串的构造函数优先于另一个。
那么我们现在的方法可以这样改进:

 

	/**
	 * 
	 * @Description:两个double类型相加,返回Double
	 * @createBy:qiqiang ran
	 * @createdate:2012-3-23
	 * @param double d1
	 * @param double d2
	 * @return double
	 */
	public static double doubleAdd(double d1, double d2) {
		BigDecimal a1 = new BigDecimal(Double.toString(d1));
		BigDecimal b1 = new BigDecimal(Double.toString(d2));
		return a1.add(b1).doubleValue();
	}
同理可得:我们可以提供相应 - * / 方法,分别对应:.subtract .multiply .div 方法。
注意:运算过程中需要注意参数,以及保留位数,比如:除法运算,里面方法很多,大家可以尝试。 
最后:这个以前就遇到过,只是临时copy 过来用用,老是不明白,
后来自己多写写,多领悟好多了,虽然还有很多不明白的地方,
但是相信自己动手 动脑去完成,总会搞清楚的。也给新入行的人提醒,
最好别一味的copy代码,哪怕是上面两行最简单的代码,写一次就深刻一次,
这也是我不将后面方法写完的原因。还有关于JS 计算也有同样的问题,
大家也可以去研究研究。

 

分享到:
评论

相关推荐

    解析Java中的精确计算方法.pdf

    "Java中的精确计算方法" Java语言中,浮点数是一种常用的数值类型,但是它并不是非常精确的。浮点数的计算结果可能会出现舍入误差,导致结果不符合预期。这种情况在金融计算、科学计算等领域中尤其重要。 IEEE 754...

    Java浮点型计算器

    【Java浮点型计算器】是一个基于Java编程语言开发的图形用户界面(GUI)应用程序,它提供了基本的数学运算,包括加法、减法、乘法和除法,针对浮点数进行计算。浮点型计算器的主要特点在于处理带有小数部分的数值,...

    Java编程中常用修饰词使用方法

    介绍:strictfp 修饰的类中所有的方法都隐藏了 strictfp 修饰词,方法执行的所有浮点计算遵守 IEEE 754 标准,所有取值包括中间的结果都必须表示为 float 或 double 类型,而不能利用由本地平台浮点格式或硬件提供的...

    Java数值计算算法编程

    本文将深入探讨Java中实现数值计算的方法、工具和最佳实践。 首先,我们要理解Java的基础数据类型,包括整型(byte, short, int, long)、浮点型(float, double)以及它们在数值计算中的应用。Java的数据类型提供...

    Java中使用的常用数学类

    这是因为Java中的`float`和`double`类型基于二进制浮点表示,可能会导致精度损失,特别是在涉及货币或高精度计算的场景下。`BigDecimal`通过使用字符串或整数构造,可以确保数值的精确表示。 1. 创建`BigDecimal`...

    java数值计算算法编程

    本主题将深入探讨这些知识点,帮助开发者掌握在Java环境中进行复杂计算的方法。 1. **基本数据类型与运算符**:Java提供了八种基本数据类型,包括整型(byte, short, int, long)、浮点型(float, double)以及布尔...

    java中基本类型及string类型

    `String`是Java中最常用的引用类型之一,用于表示文本字符串。`String`类是不可变的,意味着一旦创建了一个`String`对象,其内容就不能被改变。 - **String类的方法**: - `charAt(int index)`:返回指定索引处的...

    计算机等级二级JAVA真题

    1. **基础语法**:了解基本的数据类型(如整型、浮点型、字符型、布尔型),变量的声明与赋值,运算符(算术、比较、逻辑、位运算符)的使用,流程控制语句(如if-else、switch、for、while等)。 2. **类与对象**...

    JAVA谜思.doc JAVA 常见疑惑及解析

    然而,这个方法在处理负数时会出现错误,因为Java中的取模运算符对负数的处理不同于我们的直觉。根据Java的定义,`(a % b)` 的结果与 `a` 有相同的符号,这意味着当 `i` 是一个负奇数时,`i % 2` 实际上会得到 `-1`...

    最新精品JAVA高级备课完美版——Java基本数据类型[参考].pdf

    4. 浮点类:Java的浮点类型包括`float`和`double`,其中`double`是默认的浮点类型。`float`占32位,`double`占64位,提供更大的精度。浮点数可以使用小数点或科学计数法表示。例如: ```java float floatValue = 123...

    手机游戏Java语言基础——Java基础语法.ppt

    Java 中有两种浮点类型:float 和 double。 四、基本数据类型 * 基本数据类型包括整型、浮点类型、字符型和布尔类型。 * 整型包括 byte、short、int、long四种,通常情况下,int 类型是最常用的。 * 浮点类型包括 ...

    Java之基本数据类型 Sizeof 大小

    - `double`: 占用8个字节(64位),精度约为15位十进制数字,是Java中的默认浮点类型。 3. **字符型数据类型**: - `char`: 占用2个字节(16位),使用Unicode编码,可以表示从'\u0000'到'\uffff'的字符,即65536个...

    test2_JavaDouble类型比较大小_java编程_

    在Java编程中,Double类型的数值比较是一个常见的操作,但与我们通常处理整数或浮点数的方式略有不同。本文将详细探讨如何正确地比较Java中的Double类型数值。 首先,了解`Double`类型在Java中的定义至关重要。`...

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

    3. **`java.math`** 包:提供了大整数(BigInteger)和大浮点数(BigDecimal)类,用于处理超出普通浮点类型精度的计算。 4. **Apache Commons Math**:这是一个强大的开源库,提供了广泛的数值计算功能,包括线性...

    Java计算工具类

    "Java计算工具类"就是这样的一个类,它包含了用于基本数学运算的方法,如类型转换以及加、减、乘、除等操作。下面我们将详细讨论这个类可能包含的知识点。 1. **类型转换**: Java中的类型转换是将一种数据类型...

    JAVA基础思维导图【xmind格式】.zip

    首先,"java基本数据类型A.xmind"和"java基本数据类型B.xmind"这两张思维导图主要介绍了Java中的八种基本数据类型,包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)以及布尔型...

    国家计算机二级JAVA考试大纲

    3. **掌握数据类型和结构**:能够熟练使用Java提供的各种数据类型(如整型、浮点型、布尔型等),以及如何组织这些数据(如数组、字符串等)。 4. **掌握基本编程技术**:具备编写简单Java程序的能力,包括基本输入...

    400 道Java求职常见面试(笔试)真题与解析.pdf

    基本数据类型包括整数类型(byte、short、int、long)、字符类型(char)和浮点类型(float、double),以及布尔类型(boolean)。在Java中,整数的默认类型是int,浮点数的默认类型是double。由于Java是面向对象的...

Global site tag (gtag.js) - Google Analytics