BigDecimal数据类型与Double数据类型的区别

3
有一个在Java中由Jama Matrix编写的类。这个类就像这样:
public Matrix (int m, int n, double s) {
  this.m = m;
  this.n = n;
  A = new double[m][n];
  for (int i = 0; i < m; i++) {
     for (int j = 0; j < n; j++) {
        A[i][j] = s;
     }
  }
}

它可以创建一个 m*n 维度的矩阵,其数据类型为 double,这意味着它在小数点后面保留 6 位数字。但我需要一个可以在小数点后面保留至少 10 位数字的矩阵(例如 12.1234567890)。因此,在搜索后,我找到了 BigDecimal 数据类型,它可以接受此类值。因此,我稍微修改了以前的代码。

 public Matrix(int m,int n,BigDecimal s){
   this.m=m;
   this.n=n;
   A= new BigDecimal[m][n];
   for(int i=0;i<m;i++){
       for(int j=0;j<n;j++){
           A[i][j]=s;
       }
   }
}

但是它会抛出错误。在Java中是否有其他用于浮点数的数据类型?

当运行此代码时,我有点困惑。

 public class T {
public static void main(String args[]){
    double a= 3.256147001235;
    double b=4.200001258920;
    double c=a+b;
    System.out.println(c);
}
 }

在这里,数据类型也是double,但输出结果为7.456148260155。所以,在矩阵类中它不能够处理这么大的数字。


2
"它抛出错误": 什么错误?请提供一个 [mcve]。 - Daniel Pryden
将代码更改为 A[i][j] = s.clone(); BigDecimal是一个类。 - Victor Gubin
2
就算十进制点放在哪里,一个 double 应该不会有任何问题储存 15 个小数位。然而,第 16 位小数无法被完全储存,这可能意味着值无法准确地进行十进制回合旅程。(您需要10位离散数字吗?还是这是连续值的10位精度样本,其中1e-16的误差不是问题?) - Daniel Pryden
2
@VictorGubin:BigDecimal是一种不可变类型。对于数组中的每个条目,没有必要克隆对象;拥有对例如BigDecimal.ZERO的一百万个引用是可以的,因为它永远不会“变成”另一个数字。 - Daniel Pryden
1
@Saswati 这个错误可以通过在类级别上声明 BigDecimal[][] A 来修复。 - Sergey Kalinichenko
显示剩余3条评论
1个回答

4

BigDecimal 不像 doubleString,在Java编译器中没有内置的支持用于使用字面值构造对象。您需要使用构造函数或调用 valueOf 来构造它,具体取决于数据来源:

Matrix bigDecimalMatrix = new Matrix(100, 80, BigDecimal.valueOf(4.200001258920));

或者

Matrix bigDecimalMatrix = new Matrix(100, 80, new BigDecimal("4.200001258920"));

同样地,BigDecimal没有编译器支持运行算术操作。因此,不要使用:
double c = a + b;

您需要编写代码

BigDecimal c = a.add(b);

иҝҷдёӘй—®йўҳе®һйҷ…дёҠжІЎжңүеұ•зӨәеҮәдҪҝз”Ёеӯ—йқўйҮҸеҲқе§ӢеҢ–BigDecimalеҸӮж•°зҡ„е°қиҜ•гҖӮдҪҶжҳҜж №жҚ®й—®йўҳзҡ„еүҚжҸҗпјҢжҲ‘зҢңиҝҷжҳҜдёҖдёӘеҗҲзҗҶзҡ„зҢңжөӢгҖӮ - Daniel Pryden
@DanielPryden 当我第一次遇到 BigDecimal 时,我也有同样的反应:我不知道如何创建新的 BigDecimal 或者进行加减乘除运算。这就是为什么我怀疑 OP 需要解决他的问题。 - Sergey Kalinichenko
@dasblinkenlight,我不想知道如何将两个BigDecimal数字相加的方法。我想知道在常规算术运算中,double类型可以在小数点后保留10位数字,但是当我创建一个double类型的矩阵时,为什么它只能保留6位数字。除了BigDecimal之外,是否有更好的选项来表示巨大的浮点数? - Saswati
@Saswati 在 double 中小数点后的有效数字位数取决于小数点前的数字位数,这是由于 double 的表示方式所导致的。而 BigDecimal 则没有这个问题,它可以提供无限精度。关于“小数点后只有六位数字”的说法毫无意义,抱歉。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接