java 中 Expansion 的 double 值问题,我试图添加两个 double 值但没有给出准确性
Problem with double value with Expansion in java , I was trying to add two double values but not giving accuracy
给定的值为
double double1 = 1.0814449990040142E7;
双 double2 = 7.0164302885665664E17;
结果是 Java
中的 double1 + double2 = 7.016430288674711E17
人工计算的值为701643028867471089
谁能解决我的问题。
双精度值在 Java 中不准确,您应该使用 BigDecimal class,它具有更好的精度。
有关详细信息,请参阅文档: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);
不幸的是,这是天下没有免费午餐的例子。
Double 通过使用紧凑格式获得其性能。每个 double 正好占用 64 位。这允许在处理器和内存之间进行非常高效的存储和传输,使用寄存器来保存双精度值,以及算术的硬件实现。 BigDecimal 是一种数据结构,其大小取决于所表示的值,但可以比 64 位大得多。
您为 double 的效率付出的代价是它只能精确表示 BigDecimal 可以精确表示的数字的一个子集。最接近文字的双打是 10814449.9900401420891284942626953125 和 701643028856656640。它们的确切总和是 701643028867471089.9900401420891284942626953125。它本身不是任何 double 的精确值。它被双打 701643028867470976 和 701643028867471104 括起来,较接近的是你得到的结果。
对于许多用途来说,双打已经足够接近了。例如,如果您的变量表示测量的物理量,则测量误差将使转换为双精度的舍入误差相形见绌。可以表示为终止小数的数字并不比其他有理数和无理数重要。在这些情况下,使用双精度和四舍五入输出到由输入精度和累积舍入误差调整的位数。
其他情况,例如一些财务计算,需要对小数进行精确运算。少数情况下,小数没有特殊意义,但您需要比 double 更精确的精度。在这两种情况下,BigDecimal 都是正确的数据类型,尽管有性能成本。
给定的值为
double double1 = 1.0814449990040142E7; 双 double2 = 7.0164302885665664E17;
结果是 Java
中的 double1 + double2 = 7.016430288674711E17人工计算的值为701643028867471089
谁能解决我的问题。
双精度值在 Java 中不准确,您应该使用 BigDecimal class,它具有更好的精度。
有关详细信息,请参阅文档: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);
不幸的是,这是天下没有免费午餐的例子。
Double 通过使用紧凑格式获得其性能。每个 double 正好占用 64 位。这允许在处理器和内存之间进行非常高效的存储和传输,使用寄存器来保存双精度值,以及算术的硬件实现。 BigDecimal 是一种数据结构,其大小取决于所表示的值,但可以比 64 位大得多。
您为 double 的效率付出的代价是它只能精确表示 BigDecimal 可以精确表示的数字的一个子集。最接近文字的双打是 10814449.9900401420891284942626953125 和 701643028856656640。它们的确切总和是 701643028867471089.9900401420891284942626953125。它本身不是任何 double 的精确值。它被双打 701643028867470976 和 701643028867471104 括起来,较接近的是你得到的结果。
对于许多用途来说,双打已经足够接近了。例如,如果您的变量表示测量的物理量,则测量误差将使转换为双精度的舍入误差相形见绌。可以表示为终止小数的数字并不比其他有理数和无理数重要。在这些情况下,使用双精度和四舍五入输出到由输入精度和累积舍入误差调整的位数。
其他情况,例如一些财务计算,需要对小数进行精确运算。少数情况下,小数没有特殊意义,但您需要比 double 更精确的精度。在这两种情况下,BigDecimal 都是正确的数据类型,尽管有性能成本。