【发布时间】:2016-12-01 03:00:50
【问题描述】:
我有一个由双值(从 0 到 1)填充的矩阵。为方便起见,让我们谈谈行和列。我想规范化矩阵的双精度值,以便每一列的所有行的总和返回 1。此任务触发浮点精度问题,因为使用 double,总和将永远不会返回 1。
所以我尝试使用BigDecimal,但结果略有不同。
这是我的代码:
double[][] U = new double[6][1015];
double[] sumPerCol = new double[db.size()+1];
for(int i=0; i<U.length; i++){
for(int j =0; j<U[i].length; j++){
double x = new Random().nextDouble();
U[i][j] = x;
sumPerCol[j] += x;
}
}
double[] sumPerCol2 = new double[db.size()+1];
for(int i=0; i<U.length; i++){
for(int j =0; j<U[i].length; j++){
BigDecimal x = new BigDecimal(U[i][j],MathContext.DECIMAL128);
BigDecimal tot = new BigDecimal(sumPerCol[j],MathContext.DECIMAL128);
BigDecimal x2 = x.divide(tot,MathContext.DECIMAL128);
U[i][j] = x2.floatValue();
sumPerCol2[j] += U[i][j];
}
}
for(double d : sumPerCol2){
System.out.println(d);
}
当然,我没有正确使用BigDecimal。有人可以帮忙吗?
【问题讨论】:
-
如果你真的想要精度,你可以使用 BigDecimal,但不要将它们与双精度数混合。但即使是 BigDecimal,除法也不能总是产生精确的结果。
标签: java precision bigdecimal