`
中华好儿孙
  • 浏览: 68724 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用Java原生类BigDecimal计算的问题

    博客分类:
  • java
阅读更多
package test;

import java.math.BigDecimal;

public class TestBigDecimal {
	public static void main(String[] args) {
		BigDecimal n1 = new BigDecimal(2.2);
		BigDecimal n2 = new BigDecimal(2);
		System.out.println("new BigDecimal(2.2) 除以 new BigDecimal(2) 等于 "+n1.divide(n2));
		BigDecimal n3 = new BigDecimal("2.2");
		BigDecimal n4 = new BigDecimal("2");
		System.out.println("new BigDecimal(\"2.2\") 除以 new BigDecimal(\"2\") 等于 "+n3.divide(n4));
	}
}
/*输出:
new BigDecimal(2.2) 除以 new BigDecimal(2) 等于 1.100000000000000088817841970012523233890533447265625
new BigDecimal("2.2") 除以 new BigDecimal("2") 等于 1.1
*/


得出结论:只有将传给BigDecimal构造函数的参数为字符串时, 计算才精确。
分享到:
评论
2 楼 中华好儿孙 2015-08-24  
QuarterLifeForJava 写道
恩,double要这么写:
BigDecimal n1 = new BigDecimal(Double.toString(2.2));  
BigDecimal n2 = new BigDecimal(Double.toString(2));

其实看API它说的很清楚了:
Notes: 
1. 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. 
2. 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. 
3. 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.

临时要用的时候, 一般不大会细究API, 当发现问题是时候就会去百度, 百度不到才可能去看API, 不管怎样, 用之前先看API确实是个好习惯, 谢了!
1 楼 QuarterLifeForJava 2015-08-24  
恩,double要这么写:
BigDecimal n1 = new BigDecimal(Double.toString(2.2));  
BigDecimal n2 = new BigDecimal(Double.toString(2));

其实看API它说的很清楚了:
Notes: 
1. 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. 
2. 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. 
3. 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.

相关推荐

    java-BigInteger-BigDecimal类源码

    1. **大整数运算**:`BigInteger`类设计用于表示任意大小的整数,不受Java原生整型数据类型的限制。它可以执行所有的基本算术运算(加、减、乘、除、模)以及高级运算,如位操作和质数测试。 2. **内存管理**:由于...

    javascript版BigDecimal类库

    为了解决这个问题,开发者们引入了`BigDecimal`类库的概念,它在Java中被广泛使用,用于进行高精度的算术运算。本文将详细介绍JavaScript版的`BigDecimal`类库,以及如何在JavaScript环境中实现精确计算。 ...

    js_bigdecimal_1_0_1.zip

    在Java中,有内置的`java.math.BigDecimal`类,但JavaScript原生并不支持这样的数据类型。因此,"js_bigdecimal_1_0_1"库可能是将Java的BigDecimal概念移植到了JavaScript中,以便在Web开发中进行高精度计算。 这个...

    高精度JSBigDecimal运算

    `BigDecimal`类在Java等其他语言中是专门用来处理高精度十进制数的,它提供了丰富的算术运算方法,确保计算结果的精确性。在JavaScript中,虽然没有内置的`BigDecimal`类,但开发者可以通过第三方库来实现类似的功能...

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

    5. **使用BigDecimal类**:在某些高级应用中,可以考虑使用类似Java的`BigDecimal`类,它提供了高精度的浮点数运算,但JavaScript原生并不支持,可能需要引入第三方库。 理解JavaScript浮点数计算的局限性并采用...

    javaSWT简易计算器

    SWT 是 Eclipse 基金会的一个开源项目,它提供了一系列与操作系统原生 GUI 控件对应的 Java 类。SWT 的优势在于其高效性和原生感,因为它直接调用操作系统提供的 API,而不是模拟控件。这使得SWT创建的应用程序与...

    Java语言与Android系统

    - **Java.math**:提供BigInteger和BigDecimal等高精度计算支持。 - **Java.security**:提供安全框架相关的类和接口。 此外,Android SDK还包括了一些扩展Java包,如: - **Javax.crypto**:提供加密操作相关的类...

    20151910042-刘鹏-MC实验01-编程平台实验1

    `BigInteger`提供了比Java内置的`int`和`long`类型更大范围的整数操作,而`BigDecimal`则允许进行精确的浮点数运算,避免了浮点数计算中的精度问题。学生被要求阅读类库文档,理解它们的结构,并通过编写实例来熟悉...

    Hibernate类型映射

    理解这些映射关系有助于我们更好地设计实体类,以及正确地配置Hibernate的映射文件(如`.hbm.xml`或使用注解),从而确保数据在Java对象与数据库之间无缝转换,提高开发效率并减少错误。在实际应用中,还需要根据...

    jExigo - Java Fixed Decimal Arithmetic-开源

    - **易用性**: 提供简单直观的API,易于理解和使用,与Java原生的数值类型兼容良好。 ### 4. 开源许可证 项目包含了 `LICENSE` 文件,通常表明该项目遵循特定的开源协议,例如MIT、Apache 2.0或GPL等。用户可以...

    bignumber.js-master.zip

    这个库在JavaScript环境中提供了类似于Java中BigDecimal的功能,确保了大数运算的精确性。 bignumber.js是一个轻量级且强大的库,专为处理大数而设计。它的核心理念是创建一个全新的数据类型BigNumber,可以存储和...

    javascript 日期数字文本格式化

    `BigDecimal.js`通常用于处理大数运算,避免了JavaScript中浮点数运算精度问题,同时也提供了格式化输出的功能。而`MathContext.js`可能与`BigDecimal.js`一起使用,提供了数学上下文,用于设置运算精度和舍入模式。...

    AppDev:学习应用开发

    3. 使用分数表示法:如果需要进行精确的数学计算,尤其是涉及到分数时,可以考虑使用像BigDecimal这样的库(在Java中),或者JavaScript中的大数库如BigInt,不过JavaScript原生并不支持。 4. 避免连续除法:尽可能...

Global site tag (gtag.js) - Google Analytics