Java 如何从10.0/3*3 BigDecimal和double中获取?

Java 如何从10.0/3*3 BigDecimal和double中获取?,java,double,bigdecimal,Java,Double,Bigdecimal,我想做一个计算器,但是10/3*3有个问题 我不想只计算10/3*3这个公式,我想返回这个公式加上0.23232的浮点数。所以使用BigDecimal类。有点不对劲 我无法得到准确的结果,这就是我想要的10, 我相信你的问题可能就在这里 double a = 10.0; double b =3; double c = a/b; System.out.println(c*b);//answer = 10.0 BigDecimal bigDecimal1 = BigDecimal.valueOf

我想做一个计算器,但是10/3*3有个问题 我不想只计算10/3*3这个公式,我想返回这个公式加上0.23232的浮点数。所以使用BigDecimal类。有点不对劲 我无法得到准确的结果,这就是我想要的10,
我相信你的问题可能就在这里

double a = 10.0;
double b =3; 
double c = a/b;
System.out.println(c*b);//answer = 10.0

BigDecimal bigDecimal1 = BigDecimal.valueOf(c);
BigDecimal bigDecimal2 = new BigDecimal("3");
System.out.println(bigDecimal1.multiply(bigDecimal2));//answer = 10.0000000000000005
你以为双人可以完美地代表10/3,我怀疑它能代表10/3

也许可以尝试这样的方法,它总是将数字表示为
BigDecimal

double c = a/b;
...
BigDecimal bigDecimal1 = BigDecimal.valueOf(c);
在这一点上,您会注意到10/3不能表示为十进制

非终止十进制扩展;没有可精确表示的十进制结果

您需要确定所需的精度,然后使用舍入

new BigDecimal("10").divide(new BigDecimal("3"))

或者你可以使用一个有理数库,就像Patricia建议的那样。也许你会看到,它有点问题,我无法得到准确的结果,这就是我想要的10,得到了10,那么,问题出在哪里?对不起,我想要得到10(只使用了BigDecimal)。核心问题是没有精确等于10/3的十进制或二进制分数。可以在BigDecimal中任意接近,但不能精确。如果你需要任意分数的精确表示,你需要一个有理数包。上次我检查时,我的计算器也不能精确表示10.0/3。不幸的是,有限浮点表示被破坏了。您真正需要的是一个无限的表示,以及一台拥有无限内存的机器来容纳它………-)不。你在这里遇到的是数学。以10为基数或以2为基数的System.out.println(新的BigDecimal(“10”).setScale(10).除法(新的BigDecimal(“3”)、BigDecimal.ROUND_HALF_偶数).乘法(新的BigDecimal(“3”);我得不到10,我得到9.99999999有解决方案吗?@WeFUN解决方案需要精确,而不仅仅是近似,表示任意分数是使用有理数包。
new BigDecimal("10")
    .setScale(10)
    .divide(new BigDecimal("3"), BigDecimal.ROUND_HALF_EVEN)