最近项目改漏洞,BigDecimal注意事项
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 = new BigDecimal("1.1"); // using String constructor will result in precise value
说明:
有人可能会假设在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它正好等于0.1(未标度值1,小数位数为1),但实际上等于0.10000000000000055115123125782702118158340451015625。这是因为0.1不能精确地表示为双精度(或者,就此而言,表示为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于0.1,尽管如此。
相反,您应该使用BigDecimal。valueOf,它使用隐藏的字符串来消除浮点舍入错误,或使用字符串参数的构造函数。