在算术Java的更精确(Java more precision in arithmetic)

2019-07-31 05:40发布

我建立在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精度。 有一个数字类,它是更精确的,或者我应该只是圆的值了吗?

Answer 1:

您可以使用的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的就知道了™和做正确的事情™。



Answer 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


Answer 3:

如何BigDecimal的 ?

不会是所有部门完全准确,但(如1/3)。 对于那些你需要的部分,这是不是JDK的一部分,但容易实现 ,例如作为两个整数(或BigIntegers)。



Answer 4:

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

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


文章来源: Java more precision in arithmetic