大数减法
BigDecimal Subtraction
我想减去 2 double
个值,我试过下面的代码。
double val1 = 2.0;
double val2 = 1.10;
System.out.println(val1 - val2);
我得到的输出是,
0.8999999999999999
为了获得 0.9
的输出,我尝试使用 BigDecimal
如下,
BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);
System.out.println(val1BD.subtract(val2BD));
我得到的输出是,
0.899999999999999911182158029987476766109466552734375
然后我尝试 BigDecimal.valueOf()
val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);
System.out.println(val1BD.subtract(val2BD));
最后我得到了 0.9
的输出。
我的问题是案例 2 和案例 3 之间有什么区别?
在情况 2 中,为什么我得到这样的输出?
BigDecimal.valueOf(double d)
使用双值的规范 String
表示,在内部使用 Double.toString(double)
,这就是为什么你在第二种情况下得到 0.9
。
Note: This is generally the preferred way to convert a double (or
float) into a BigDecimal, as the value returned is equal to that
resulting from constructing a BigDecimal from the result of using
Double.toString(double)
.
虽然使用 new BigDecimal(0.9)
它将值转换为 double
值的精确 浮点数 表示而不使用 String
表示,
Translates a double into a BigDecimal
which is the exact decimal
representation of the double's binary floating-point value.
...
NOTES :
- The results of this constructor can be somewhat unpredictable.
...
例如:
BigDecimal bd1 = new BigDecimal(Double.toString(0.9));
BigDecimal bd2 = new BigDecimal(0.9);
System.out.println(bd1);
System.out.println(bd2);
输出:
0.9
0.90000000000000002220446049250313080847263336181640625
仅供那些来到这里寻找 BigDecimal 的其他问题(与上述问题无关)的其他人......
记得给方法一个 mathContext 以避免某些问题,例如
MathContext mc = new MathContext(10, RoundingMode.HALF_UP);
BigDecimal hitRate = new BigDecimal(totalGetValuesHitted).divide(new BigDecimal(totalGetValuesRequested), mc);
BigDecimal missRate = new BigDecimal(1.0, mc).subtract(hitRate, mc);
我想减去 2 double
个值,我试过下面的代码。
double val1 = 2.0;
double val2 = 1.10;
System.out.println(val1 - val2);
我得到的输出是,
0.8999999999999999
为了获得 0.9
的输出,我尝试使用 BigDecimal
如下,
BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);
System.out.println(val1BD.subtract(val2BD));
我得到的输出是,
0.899999999999999911182158029987476766109466552734375
然后我尝试 BigDecimal.valueOf()
val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);
System.out.println(val1BD.subtract(val2BD));
最后我得到了 0.9
的输出。
我的问题是案例 2 和案例 3 之间有什么区别?
在情况 2 中,为什么我得到这样的输出?
BigDecimal.valueOf(double d)
使用双值的规范 String
表示,在内部使用 Double.toString(double)
,这就是为什么你在第二种情况下得到 0.9
。
Note: This is generally the preferred way to convert a double (or float) into a BigDecimal, as the value returned is equal to that resulting from constructing a BigDecimal from the result of using
Double.toString(double)
.
虽然使用 new BigDecimal(0.9)
它将值转换为 double
值的精确 浮点数 表示而不使用 String
表示,
Translates a double into a
BigDecimal
which is the exact decimal representation of the double's binary floating-point value....
NOTES :
- The results of this constructor can be somewhat unpredictable.
...
例如:
BigDecimal bd1 = new BigDecimal(Double.toString(0.9));
BigDecimal bd2 = new BigDecimal(0.9);
System.out.println(bd1);
System.out.println(bd2);
输出:
0.9
0.90000000000000002220446049250313080847263336181640625
仅供那些来到这里寻找 BigDecimal 的其他问题(与上述问题无关)的其他人...... 记得给方法一个 mathContext 以避免某些问题,例如
MathContext mc = new MathContext(10, RoundingMode.HALF_UP);
BigDecimal hitRate = new BigDecimal(totalGetValuesHitted).divide(new BigDecimal(totalGetValuesRequested), mc);
BigDecimal missRate = new BigDecimal(1.0, mc).subtract(hitRate, mc);