使用Java BigDecimal仍然没有正确解决

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可能高于当前范围,我怎样才能正确地做到这一点?(它们以单独的方法计算).

我应该使用四舍五入吗?

Jor*_*lla 8

我应该使用四舍五入吗?

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)

在这里工作IDEONE DEMO


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注意到的问题.

新的工作演示