BigDecimal(double)和BigDecimal(String)有什么区别?
典型回答 有区别,而且区别很大。 因为double是不精确的,所以使用一个不精确的数字来创建BigDecimal,得到的数字也是不精确的。如0.1这个数字,double只能表示他的近似值。 所以,当我们使用new BigDecimal(0.1)创建一个BigDecimal 的时候,其实创建出来的值并不是正好等于0.1的。 而是0.1000000000000000055511151231257827021181583404541015625。这是因为double自身表示的只是一个近似值。 而对于BigDecimal(String) ,当我们使用new BigDecimal(“0.1”)创建一个BigDecimal 的时候,其实创建出来的值正好就是等于0.1的。 那么他的标度也就是1 扩展知识 在《阿里巴巴Java开发手册》中有一条建议,或者说是要求: BigDecimal如何精确计数? 如果大家看过BigDecimal的源码,其实可以发现,实际上一个BigDecimal是通过一个"无标度值"和一个"标度"来表示一个数的。 无标度值(Unscaled Value):这是一个整数,表示BigDecimal的实际数值。 标度(Scale):这是一个整数,表示小数点后的位数。 BigDecimal的实际数值计算公式为:unscaledValue × 10^(-scale)。 假设有一个BigDecimal表示的数值是123.45,那么无标度值(Unscaled Value)是12345。标度(Scale)是2。因为123.45 = 12345 × 10^(-2)。 涉及到的字段就是这几个: 1 2 3 4 5 public class BigDecimal extends Number implements Comparable<BigDecimal> { private final BigInteger intVal; private final int scale; private final transient long intCompact; } 关于无标度值的压缩机制大家了解即可,不是本文的重点,大家只需要知道BigDecimal主要是通过一个无标度值和标度来表示的就行了。 那么标度到底是什么呢? 除了scale这个字段,在BigDecimal中还提供了scale()方法,用来返回这个BigDecimal的标度。 1 2 3 4 5 6 7 8 9 10 11 12 13 /** * Returns the <i>scale</i> of this {@code BigDecimal}. If zero * or positive, the scale is the number of digits to the right of * the decimal point. If negative, the unscaled value of the * number is multiplied by ten to the power of the negation of the * scale. For example, a scale of {@code -3} means the unscaled * value is multiplied by 1000. * * @return the scale of this {@code BigDecimal}. */ public int scale() { return scale; } 那么,scale到底表示的是什么,其实上面的注释已经说的很清楚了。 ...