double a = 2.0; double b = 3.0; BigDecimal temp = BigDecimal.valueOf(a/b, 16); double c = doubleValue();
楼上错了, valueOf(long, int) 除法能这么用吗? 你的结果是多少? 0.0000000000000000应该这样: BigDecimal r = new BigDecimal(2.0).divide(new BigDecimal(3.0), 17, BigDecimal.ROUND_HALF_UP); System.out.println(r); 结果是: 0.66666666666666667
to 楼上,对不起,并不是和你抬扛,但是测试结果确实不对.你的错误出在valueOf参数传递a/b已经是0了,在这个地方精度就丢掉了.下面是证明: public class TestDivide extends TestCase { public TestDivide(String name) {super(name);} public void testDivide() { double a = 2.0; double b = 3.0; BigDecimal temp = BigDecimal.valueOf((long)(a/b), 16); double c = temp.doubleValue(); assertEquals(0.6666666666666667D, c, 0.0000000000000001D); } } 运行测试的结果: =========================================== .F Time: 0.011 There was 1 failure: 1) testDivide(TestDivide)junit.framework.AssertionFailedError: expected:<0.6666666666666667> but was:<0.0> at TestDivide.testDivide(TestDivide.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at com.intellij.rt.execution.junit.TextTestRunner.main(TextTestRunner.java:12)FAILURES!!! Tests run: 1, Failures: 1, Errors: 0
不好意思,上面写错了,应该是这样的 double a = 2.0; double b = 3.0; BigDecimal temp = new BigDecimal(a/b); temp = temp.setScale(16, BigDecimal.ROUND_HALF_UP); double c = temp.doubleValue();
double b = 3.0;
BigDecimal temp = BigDecimal.valueOf(a/b, 16);
double c = doubleValue();
你的结果是多少?
0.0000000000000000应该这样:
BigDecimal r = new BigDecimal(2.0).divide(new BigDecimal(3.0), 17, BigDecimal.ROUND_HALF_UP);
System.out.println(r);
结果是:
0.66666666666666667
public class TestDivide extends TestCase {
public TestDivide(String name) {super(name);} public void testDivide() {
double a = 2.0;
double b = 3.0;
BigDecimal temp = BigDecimal.valueOf((long)(a/b), 16);
double c = temp.doubleValue();
assertEquals(0.6666666666666667D, c, 0.0000000000000001D);
}
}
运行测试的结果:
===========================================
.F
Time: 0.011
There was 1 failure:
1) testDivide(TestDivide)junit.framework.AssertionFailedError: expected:<0.6666666666666667> but was:<0.0>
at TestDivide.testDivide(TestDivide.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.junit.TextTestRunner.main(TextTestRunner.java:12)FAILURES!!!
Tests run: 1, Failures: 1, Errors: 0
double a = 2.0;
double b = 3.0;
BigDecimal temp = new BigDecimal(a/b);
temp = temp.setScale(16, BigDecimal.ROUND_HALF_UP);
double c = temp.doubleValue();