3 回答
TA贡献1828条经验 获得超3个赞
不幸的是,这是一个没有免费午餐之类的事情。
Double 通过使用紧凑格式来获得其性能。每个双精度型正好占据 64 位。这允许在处理器和内存之间进行非常有效的存储和传输,使用寄存器来保存双精度值,以及算术的硬件实现。BigDecimal 是一种数据结构,其大小取决于所表示的值,但可以远大于 64 位。
您为 double 的效率付出的代价是它只能精确地表示 BigDecimal 可以精确表示的数字的一个子集。与您的文字最接近的双精度数是 10814449.9900401420891284942626953125 和 701643028856656640。它们的确切总和是 701643028867471089.94042040216162825261626953125 它本身不是任何双精度值的确切值。它被双打 701643028867470976 和 701643028867471104 括起来,其中越接近的就是你得到的结果。
出于许多目的,双打已经足够接近了。例如,如果您的变量代表测量的物理量,则测量误差将使转换为双倍时的舍入误差相形见绌。可以表示为终止小数的数字并不比其他有理数和无理数更重要。在这些情况下,使用双精度和舍入输出到输入精度和累积舍入误差证明的位数。
其他情况,例如某些财务计算,需要对小数进行精确算术。很少,小数没有特殊意义,但您需要比 double 可以提供的精度更高的精度。在这两种情况下,尽管存在性能成本,但 BigDecimal 是正确的数据类型。
TA贡献1820条经验 获得超2个赞
Java 中的双精度值不准确,您应该使用 BigDecimal 类,它具有更好的精度。
有关更多信息,请参阅文档:https : //docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
TA贡献1712条经验 获得超3个赞
只需按照您想要的方式对其进行格式化
double double1 = 1.0814449990040142E7;
double double2 = 7.0164302885665664E17;
System.out.printf("%.2f", double1 + double2);
输出701643028867471100.00
或者
System.out.printf("%.0f", double1 + double2);
添加回答
举报