java 大十进制减法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/32546553/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
BigDecimal Subtraction
提问by Rakesh KR
I want to substract 2 double
values, and I have tried the following code.
我想减去 2 个double
值,我尝试了以下代码。
double val1 = 2.0;
double val2 = 1.10;
System.out.println(val1 - val2);
and I got the output as,
我得到的输出是,
0.8999999999999999
For getting output as 0.9
I tried with BigDecimal
as follows,
为了获得0.9
我尝试BigDecimal
如下的输出,
BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);
System.out.println(val1BD.subtract(val2BD));
And I got the output as,
我得到的输出是,
0.899999999999999911182158029987476766109466552734375
Then I tried with BigDecimal.valueOf()
然后我试过 BigDecimal.valueOf()
val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);
System.out.println(val1BD.subtract(val2BD));
And finally I got the output as 0.9
.
最后我得到了输出为0.9
.
My question is what is the difference between case 2 & case 3?
我的问题是案例 2 和案例 3 之间有什么区别?
In case 2 why I got the output like that?
在情况 2 为什么我得到这样的输出?
采纳答案by CoderCroc
BigDecimal.valueOf(double d)
uses canonical String
representation of double value, internally Double.toString(double)
is used, that's why you are getting 0.9
in second case.
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)
.
注意:这通常是将双精度(或浮点数)转换为 BigDecimal 的首选方法,因为返回的值等于根据 using 的结果构造 BigDecimal 的结果
Double.toString(double)
。
While with new BigDecimal(0.9)
it converts value to exact floating pointrepresentation of double
value without using String
representation,
同时用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.
...
将 double 转换为
BigDecimal
double 的二进制浮点值的精确十进制表示形式。...
注意事项:
- 此构造函数的结果可能有些不可预测。
...
FOR EXAMPLE :
例如 :
BigDecimal bd1 = new BigDecimal(Double.toString(0.9));
BigDecimal bd2 = new BigDecimal(0.9);
System.out.println(bd1);
System.out.println(bd2);
OUTPUT :
输出 :
0.9
0.90000000000000002220446049250313080847263336181640625
回答by SLuck
Just for those others that got here looking for some other issue with BigDecimal(not related to the question above)... remember to give a mathContext to the methods to avoid certain problems e.g.
只是为了那些来到这里寻找 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);