java中扩展的双值问题,我试图添加两个双值但没有给出准确度

给定的值是

双双1 = 1.0814449990040142E7;双双2 = 7.0164302885665664E17;

结果是 double1 + double2 = 7.016430288674711E17 在 Java 中

手动计算的值为701643028867471089

谁能解决我的问题。


狐的传说
浏览 166回答 3
3回答

倚天杖

不幸的是,这是一个没有免费午餐之类的事情。Double 通过使用紧凑格式来获得其性能。每个双精度型正好占据 64 位。这允许在处理器和内存之间进行非常有效的存储和传输,使用寄存器来保存双精度值,以及算术的硬件实现。BigDecimal 是一种数据结构,其大小取决于所表示的值,但可以远大于 64 位。您为 double 的效率付出的代价是它只能精确地表示 BigDecimal 可以精确表示的数字的一个子集。与您的文字最接近的双精度数是 10814449.9900401420891284942626953125 和 701643028856656640。它们的确切总和是 701643028867471089.94042040216162825261626953125 它本身不是任何双精度值的确切值。它被双打 701643028867470976 和 701643028867471104 括起来,其中越接近的就是你得到的结果。出于许多目的,双打已经足够接近了。例如,如果您的变量代表测量的物理量,则测量误差将使转换为双倍时的舍入误差相形见绌。可以表示为终止小数的数字并不比其他有理数和无理数更重要。在这些情况下,使用双精度和舍入输出到输入精度和累积舍入误差证明的位数。其他情况,例如某些财务计算,需要对小数进行精确算术。很少,小数没有特殊意义,但您需要比 double 可以提供的精度更高的精度。在这两种情况下,尽管存在性能成本,但 BigDecimal 是正确的数据类型。

DIEA

Java 中的双精度值不准确,您应该使用 BigDecimal 类,它具有更好的精度。有关更多信息,请参阅文档:https : //docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

交互式爱情

只需按照您想要的方式对其进行格式化double double1 = 1.0814449990040142E7; double double2 = 7.0164302885665664E17;System.out.printf("%.2f", double1 + double2);输出701643028867471100.00或者System.out.printf("%.0f", double1 + double2);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java