Ada*_*vis 4 java math double bigdecimal
我有一个double
输入两个值的方法.当尝试将它们添加到一起时,我得到的值超过了某个阈值,所以我开始使用BigDecimal
.
但即使BigDecimal
我仍然有不正确的值?
double value1 = 2789.45;
double value2 = 557.89;
System.out.println(BigDecimal.valueOf(value1 + value2));
Run Code Online (Sandbox Code Playgroud)
版画
3347.3399999999997
Run Code Online (Sandbox Code Playgroud)
什么时候应该读作
3347.34
Run Code Online (Sandbox Code Playgroud)
即使value1
并且value2
可能高于当前范围,我怎样才能正确地做到这一点?(它们以单独的方法计算).
我应该使用四舍五入吗?
我应该使用四舍五入吗?
NOPE,你所经历的是double
总和精度的损失.
你value1 + value2
将双精度(和精度损失)转换为a之后的双精度()BigDecimal
.
为避免这种情况,请改用:
double value1 = 2789.45;
double value2 = 557.89;
System.out.println(BigDecimal.valueOf(value1).add(BigDecimal.valueOf(value2)));
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
3347.34
Run Code Online (Sandbox Code Playgroud)
UPDATE
-1.而不是使用
BigDecimal.valueOf
,仍然是脆弱的,你应该BigDecimal
从一开始就使用,并创建它们new BigDecimal("2789.45")
,new BigDecimal("557.89")
.一旦你使用了double
文字,你就引入了不精确.BigDecimal.valueOf
试图让它恢复,但它并不总是有效.-Louis Wasserman
其实我并不完全同意这一点.你不能硬编码创建新小数的值,我可以同意的是直接读取值(如果可能的话),String
以避免double
精度损失:
String value1 = "2789.45";
BigDecimal one = new BigDecimal(value1);
String value2 = "557.89";
BigDecimal two = new BigDecimal(value2);
System.out.println(one.add(two));
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
3347.34
Run Code Online (Sandbox Code Playgroud)
这样可以避免Louis Wasserman
注意到的问题.
新的工作演示
归档时间: |
|
查看次数: |
726 次 |
最近记录: |