BigDecimal(double)

原创 2016年08月30日 00:54:14

“BigDecimal(double)” should not be used

级别:bug

Because of floating point imprecision, you’re unlikely to get the value you expect from the BigDecimal(double) constructor.

From the JavaDocs:

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.

Instead, you should use BigDecimal.valueOf, which uses a string under the covers to eliminate floating point rounding errors.

Noncompliant Code Example

double d = 1.1;

BigDecimal bd1 = new BigDecimal(d); // Noncompliant; see comment above
BigDecimal bd2 = new BigDecimal(1.1); // Noncompliant; same result

Compliant Solution

double d = 1.1;

BigDecimal bd1 = BigDecimal.valueOf(d);
BigDecimal bd2 = BigDecimal.valueOf(1.1);

see https://www.securecoding.cert.org/confluence/display/java/NUM10-J.+Do+not+construct+BigDecimal+objects+from+floating-point+literals

不要使用BigDecimal(double)去构造一个BigDecimal对象,因为double类型在计算机表示方法中并不精确,因此,BigDecimal(double)构造出来的对象很可能不是预期的大小,若一定要使用double类型去构造一个BigDecimal对象,请使用BigDecimal.valueOf方法,该方法先将double转换为String,再通过String构造BigDecimal对象,通常更建议使用public BigDecimal(String val)构造方法。

相关文章推荐

BigDecimal 保住数据精度

双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。Java在java.math包中提供的类BigDecimal,用来对超过16位有效位的数进行精确的...

BigDecimal

package testaa; import java.math.BigDecimal; public class test01 { public static void main(Strin...

关于BigDecimal(Double.toString(double val))与BigDecimal(double val)的区别

通过查询API找到了BigDecimal(Double.toString(double val))与BigDecimal(double val)的区别。

BigDecimal向Double转换

  • 2017年06月22日 16:44
  • 12KB
  • 下载

Java精确计算,用BigDecimal来处理int、double、float等之间的计算

1、先看我遇到的问题:计算3乘以4.9的值,正常来说答案应该是14.7,但是如果你用下面的代码执行完之后答案是: package com.acconsys.plugin.test; public...

Double与BigDecimal 精度问题

分类: JAVA文摘 2012-03-30 17:05 48人阅读 评论(0) 收藏 举报 1] 精确的浮点运算: 在Java里面,有时候为了保证数值的准确性需要精确的数据,先...

Java之浮点四则运算工具类-(double/float转化为BigDecimal)

package zmx.util; import java.math.BigDecimal; public class ArithUtil {  // 源文件Arith.java:  /** ...

BigDecimal类——解决double精度丢失

/* BigDecimal类 * * 现象:java中double类型计算时可能出现精度丢失问题。比如在对一系列double数值进行累加的时候:3.41+5.2+56.2+23.3+... (这...
  • rexih
  • rexih
  • 2015年03月03日 15:33
  • 502

Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

1、float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。 原因:超出float精度范围,无法精确计算。 float和double的精...
  • ShareUs
  • ShareUs
  • 2016年05月17日 15:48
  • 3375

JAVA BigDecimal的构造double类型

BigDecimal activePrice = new BigDecimal(4).multiply(new BigDecimal(0.01)); 开发过程中遇到的这样的问题,以上active...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BigDecimal(double)
举报原因:
原因补充:

(最多只允许输入30个字)