Java在算术上更精确

时间:2012-08-29 07:14:12

标签: java math floating-accuracy

我正在使用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准确度都不可靠。是否有一个更精确的数字类,或者我应该将值四舍五入?

4 个答案:

答案 0 :(得分:6)

您可以使用BigDecimal。这很难看,但它确实有效:

BigDecimal a = new BigDecimal("0.15");
BigDecimal b = new BigDecimal("0.01");
System.out.println(a.subtract(b));

确保使用String参数或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

因为如果你传入一个double,你也会将double的不准确性传递给新的BigDecimal实例。如果你传入一个字符串,BigDecimal将知道™并做正确的事情。

答案 1 :(得分:2)

使用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

答案 2 :(得分:1)

BigDecimal怎么样?

但是对于所有部门来说都不会完全准确(例如1/3)。为此你需要分数,它不是JDK的一部分,而是easy to implement,例如作为两个整数(或BigIntegers)。

答案 3 :(得分:0)

  BigDecimal  a = new BigDecimal(".15");
  BigDecimal  b = new BigDecimal(".01"),
  BigDecimal  c = new BigDecimal(0);

  c = a.subtract(b);      
  System.out.println(c);