A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

java的float、double两种基本浮点类型容易引起精度丢失
首先来看个程序:
输出结果为:

上面的程序运行结果表明,java的double类型会发生精度丢失,尤其是在进行算术运算时更容易发送这种情况。
为了能精确表示、计算浮点数,java提供了BigDecimal类,该类提供了大量的构造器用于创建BigDecimal对象,包括把所有的基本数值型变量转换成一个BigDecimal对象,也包括利用数字字符串、数字字符数组来创建BigDecimal对象。
其中的部分构造器为:

其中,查看BigDecimal类的BigDecimal(double val)构造器:


可以看到不推荐使用该构造器的说明,主要是因为使用该构造器时有一定的不可预知性。当程序使用
new BigDecimal(0.1)来创建一个BigDecimal对象时,他的值并不是0.1,他实际上等于0.100000000000000005551115
1231257827021181583404541015625。 这是因为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()等方法对精确浮点数进行常规算术运算。
示例:


控制台输出结果:







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马