黑马程序员技术交流社区
标题:
个人总结之利用BigDecimal类处理基本浮点类型的精度丢失问题
[打印本页]
作者:
tomson_tang
时间:
2015-2-6 10:48
标题:
个人总结之利用BigDecimal类处理基本浮点类型的精度丢失问题
java的float、double两种基本浮点类型容易引起精度丢失
首先来看个程序:
输出结果为:
上面的程序运行结果表明,java的double类型会发生精度丢失,尤其是在进行算术运算时更容易发送这种情况。
为了能精确表示、计算浮点数,java提供了BigDecimal类,该类提供了大量的构造器用于创建BigDecimal对象,包括把所有的基本数值型变量转换成一个BigDecimal对象,也包括利用数字字符串、数字字符数组来创建BigDecimal对象。
其中的部分构造器为:
其中,查看BigDecimal类的BigDecimal(double val)构造器:
可以看到不推荐使用该构造器的说明,主要是因为使用该构造器时有一定的不可预知性。当程序使用
new BigDecimal(0.1)来创建一个BigDecimal对象时,他的值并不是0.1,他实际上等于
0.100000000000000005551115
123
125782
7021181583404541015625。
这是因为0.1无法准确的表示为double浮点数,所以传入BigDecimal构造器的值不会正好等于0.1(虽然表明上等于该值)。
使用BigDecimal(String val)构造器的结果是可预知的,譬如写入newBigDecimal(“0.1”)将创建一个BigDecimal对象,它正好等于预期的0.1,因此通常推荐优先使用基于String的构造器。
如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。
BigDecimal类提供了add(),subtract(),multiply(),divide(),pow()等方法对精确浮点数进行常规算术运算。
示例:
控制台输出结果:
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2