精度丢失

来源:互联网 发布:加入网络作协要求 编辑:程序博客网 时间:2024/05/01 13:27

查看BigDecimal(double val)构造器时可以发现,使用该类构造器时有一定的不可预知性。当程序使用new BigDecimal构造器来创建一个对象,它的值并不是0.01,他实际上等于一个近似0.1数。这是因为0.1无法精确表示为double浮点数,所以传入BigDecimal构造器的值不会正好等于0.1(虽然表面上等于该值)。

如果使用BigDecimal(String val)构造器的结果是可预知的——写入new BigDecimal("0.1");将创建一个BigDecimal,他正好等于预期的0.1。因此通常建议优先使用基于String的构造器。

如果必须使用double浮点数作为BigDecimal的构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。

import java.math.BigDecimal;public class BigDecimalTest {public static void main(String[] args){BigDecimal f1=new BigDecimal("0.05");BigDecimal f2=BigDecimal.valueOf(0.01);BigDecimal f3=new BigDecimal(0.05);System.out.println("使用String作为BigDecimal构造器参数:");System.out.println("0.05+0.01="+f1.add(f2));System.out.println("0.05-0.01="+f1.subtract(f2));System.out.println("0.05*0.01="+f1.multiply(f2));System.out.println("0.05/0.01="+f1.divide(f2));System.out.println("使用double作为BigDecimal构造器参数");System.out.println("0.05+0.01="+f3.add(f2));System.out.println("0.05-0.01="+f3.subtract(f2));System.out.println("0.05*0.01="+f3.multiply(f2));System.out.println("0.05/0.01="+f3.divide(f2));}}

BigDecimal的真正用法

如果程序中要求对double浮点型数组进行加、减、乘、除基本运算,则需要先将double类型数值包装成BigDecimal对象,调用BigDecimal对象的方法执行运算后再将运算结果转换成double型变量。这是比较繁琐的过程,可以考虑以BigDecemal为基础定义一个Arith工具类

import java.math.BigDecimal;public class BigDecimalTest {public static void main(String[] args){BigDecimal f1=new BigDecimal("0.05");BigDecimal f2=BigDecimal.valueOf(0.01);BigDecimal f3=new BigDecimal(0.05);System.out.println("使用String作为BigDecimal构造器参数:");System.out.println("0.05+0.01="+f1.add(f2));System.out.println("0.05-0.01="+f1.subtract(f2));System.out.println("0.05*0.01="+f1.multiply(f2));System.out.println("0.05/0.01="+f1.divide(f2));System.out.println("使用double作为BigDecimal构造器参数");System.out.println("0.05+0.01="+f3.add(f2));System.out.println("0.05-0.01="+f3.subtract(f2));System.out.println("0.05*0.01="+f3.multiply(f2));System.out.println("0.05/0.01="+f3.divide(f2));}}






原创粉丝点击