我建立在Java的Web应用程序,并数学和显示步骤给用户。 在做基本的数学运算与小数,我经常得到准确的输出凌乱。
这里是我的问题:
double a = 0.15;
double b = 0.01;
System.out.println(a - b);
// outputs 0.13999999999999999
float a = 0.15;
float b = 0.01;
System.out.println(a - b);
// outputs 0.14
float a = 0.16f;
float b = 0.01f;
System.out.println(a - b);
// outputs 0.14999999
double a = 0.16;
double b = 0.01;
System.out.println(a - b);
// outputs 0.15
无论是可靠complete
精度。 有一个数字类,它是更精确的,或者我应该只是圆的值了吗?
您可以使用的BigDecimal这一点。 它的丑陋,但它的工作原理:
BigDecimal a = new BigDecimal("0.15");
BigDecimal b = new BigDecimal("0.01");
System.out.println(a.subtract(b));
一定要建立他们要么用字符串参数,或使用valueOf
方法,如下所示:
BigDecimal x = new BigDecimal("0.15"); // This is ok
BigDecimal x = BigDecimal.valueOf(0.15); // This is also ok
而不是用双参数,如下所示:
BigDecimal x = new BigDecimal(0.15); // DON'T DO THIS
因为如果你在一个双通,你也将通过在双重的不准确进入新的BigDecimal实例。 如果您在传递一个字符串,BigDecimal的就知道了™和做正确的事情™。
您需要使用时,应用合理的圆形double
。 如果你这样做,你可以得到15位数字的准确性比足以在大多数情况下多。
double a = 0.15;
double b = 0.01;
System.out.printf("%.2f%n", a - b);
double a2 = 0.16;
double b2 = 0.01;
System.out.printf("%.2f%n", a2 - b2);
版画
0.14
0.15
如何BigDecimal的 ?
不会是所有部门完全准确,但(如1/3)。 对于那些你需要的部分,这是不是JDK的一部分,但容易实现 ,例如作为两个整数(或BigIntegers)。
BigDecimal a = new BigDecimal(".15");
BigDecimal b = new BigDecimal(".01"),
BigDecimal c = new BigDecimal(0);
c = a.subtract(b);
System.out.println(c);