为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2021-12-01 19:43:04
给定的值是双双1 = 1.0814449990040142E7;双双2 = 7.0164302885665664E17;结果是 double1 + double2 = 7.016430288674711E17 在 Java 中手动计算的值为701643028867471089谁能解决我的问题。
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

不幸的是,这是一个没有免费午餐之类的事情。

Double 通过使用紧凑格式来获得其性能。每个双精度型正好占据 64 位。这允许在处理器和内存之间进行非常有效的存储和传输,使用寄存器来保存双精度值,以及算术的硬件实现。BigDecimal 是一种数据结构,其大小取决于所表示的值,但可以远大于 64 位。

您为 double 的效率付出的代价是它只能精确地表示 BigDecimal 可以精确表示的数字的一个子集。与您的文字最接近的双精度数是 10814449.9900401420891284942626953125 和 701643028856656640。它们的确切总和是 701643028867471089.94042040216162825261626953125 它本身不是任何双精度值的确切值。它被双打 701643028867470976 和 701643028867471104 括起来,其中越接近的就是你得到的结果。

出于许多目的,双打已经足够接近了。例如,如果您的变量代表测量的物理量,则测量误差将使转换为双倍时的舍入误差相形见绌。可以表示为终止小数的数字并不比其他有理数和无理数更重要。在这些情况下,使用双精度和舍入输出到输入精度和累积舍入误差证明的位数。

其他情况,例如某些财务计算,需要对小数进行精确算术。很少,小数没有特殊意义,但您需要比 double 可以提供的精度更高的精度。在这两种情况下,尽管存在性能成本,但 BigDecimal 是正确的数据类型。



查看完整回答
反对 回复 2021-12-01
?
DIEA

TA贡献1820条经验 获得超2个赞

Java 中的双精度值不准确,您应该使用 BigDecimal 类,它具有更好的精度。

有关更多信息,请参阅文档:https : //docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html


查看完整回答
反对 回复 2021-12-01
?
交互式爱情

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);


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信