Java在算术上更精确

Pat*_*rio 4 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
Run Code Online (Sandbox Code Playgroud)

两者对complete准确性都不可靠.是否有一个更精确的数字类,或者我应该将值四舍五入?

jqn*_*qno 6

你可以使用BigDecimal.这很难看,但它有效:

BigDecimal a = new BigDecimal("0.15");
BigDecimal b = new BigDecimal("0.01");
System.out.println(a.subtract(b));
Run Code Online (Sandbox Code Playgroud)

一定要使用String参数或valueOf方法构造它们,如下所示:

BigDecimal x = new BigDecimal("0.15");   // This is ok
BigDecimal x = BigDecimal.valueOf(0.15); // This is also ok
Run Code Online (Sandbox Code Playgroud)

而不是双参数,像这样:

BigDecimal x = new BigDecimal(0.15); // DON'T DO THIS
Run Code Online (Sandbox Code Playgroud)

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