BigDecimal.valueOf(0.03f)
最近工作中一个同事用到了上述用法,感觉会丢失精度,但也不是特别确定,于是把BigDecimal这块使用过程中踩过的坑稍微整理一下。
使用误区一:初始化
System.out.println(new BigDecimal("0.03")); System.out.println(new BigDecimal(3)); System.out.println(new BigDecimal(0.03)); System.out.println(BigDecimal.valueOf(3L)); System.out.println(BigDecimal.valueOf(0.03)); System.out.println(BigDecimal.valueOf(0.03f));
上述你能准确说出运行结果么?
0.03 3 0.0299999999999999988897769753748434595763683319091796875 3 0.03 0.029999999329447746
原理分析
最常用的标准构造器为:
public BigDecimal(String val);
另一个也基本一致:
public static BigDecimal valueOf(double val) { return new BigDecimal(Double.toString(val)); }
其他构造器使用不小心的话就可能产生问题,这块后续对java中的数值类型精度方面做个细致的学习和整理。
BigDecimal.valueOf(0.03f)这个数值不符合预期是float转double的时候丢失精度了,跟BigDecimal无关。
使用误区二:比较
BigDecimal a = new BigDecimal("1.23"); BigDecimal b = new BigDecimal("1.230"); System.out.println(a.equals(b)); //false
结果竟不是预期的true。
原理分析
equals是比较内容,自然不一样。BigDecimal的比较要用compareTo
System.out.println(a.compareTo(b)); //0表示相等
使用误区三:运算
BigDecimal c = new BigDecimal("1.23"); BigDecimal d = new BigDecimal("1.23"); c.add(d); System.out.println(c);
结果是2,46么?
显然不是,仍然是1.23
原理分析
BigDecimal加减乘除最终都返回的是一个新的BigDecimal对象,c.add(d);虽然做了加法操作,但是c并没有保存加操作后的值,正确的用法应该是c=c.add(d)。
使用误区四:除不尽
System.out.println(new BigDecimal("100").divide(new BigDecimal("12")));结果直接抛异常了。
异常 如下:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
原理分析
BigDecimal的除法要养成习惯去设置精度,以免出现无限循环小数而抛异常。
new BigDecimal("100").divide(new BigDecimal("12").setScale(2, BigDecimal.ROUND_HALF_DOWN)
相关推荐
BigInteger BigDecimal 使用
详细描述了BigDecimal类型的应用方式。
javascript的数值精确计算类bigdecimal,改编自java的bigdecimal
BigDecimal工具类.docx
java丢失精度,bigdecimal加减乘除
BigDecimal的计算
使用例 <!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+10"))); //- alert(new BigDecimal("10").subtract(new BigDecimal("3E+10"))); //* alert(new BigDecimal("10").multiply(new ...
BigDecimal 使用方法小节:包含构造方法及和、差、商、积等运算方式
BigDecimal类型使用
BigDecimal向Double转换
BigDecimal类,常用方法是用介绍
BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别...
复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数
bigdecimal转integer
这时,可以使用 BigDecimal 的 intValue() 方法进行转换。 当 BigDecimal 值小于或等于 Integer.MAX_VALUE(2^31-1)时,intValue() 方法返回 BigDecimal 对象的整数值。例如,在上面的示例代码中,输入的 ...
bigdecimal加减乘除运算
string转bigdecimal类型
BigDecimal b1=new BigDecimal("1.0"); BigDecimal b2=new BigDecimal("1.00"); boolean t=b1.equals(b2); 怎么样,你认为t是true还是false?它还真是false。BigDecimal的大小比较,1.0与1.00是不相等的,得采用...
BigInteger.java BigDecimal.java 文件 源代码
主要介绍了Java Bigdecimal使用原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下