无法使用Java将Scientific表示法中的double转换为Integer String或Long

时间:2016-12-08 21:23:44

标签: java

我有以下代码6.2284800183620495E18

单元格值为6228480018362050000我得到的输出是......

现在我不是专家,但是我使用this输出6228480018362049536 6.2284800183620495E18 6.2284800183620495E18,我希望这样,但是Java给了我......

6228480018362049536

为什么6228480018362050000而非DisplayAlert()以及如何获得实数?

我正在使用Java8

2 个答案:

答案 0 :(得分:2)

浮点

floatFloatdoubleDouble类型都使用floating point技术。这种技术会牺牲准确性来提高执行速度。当处理非常大或非常小的数字时,该技术也有限制。

BigDecimal

对于准确的数字,或非常大/小的数字,请使用BigDecimal类(或其整数表兄,BigInteger类)。与浮点相比,执行速度非常慢,但准确且具有更大的大小限制。这对类是关于Java的最好的东西之一,与缺乏arbitrary precision arithmetic工具的其他开发环境相比,这是一个主要优势。

BigDecimal类支持:

示例代码。

String input = "6.2284800183620495E18" ;
BigDecimal bd = new BigDecimal( input );
  

bd.toString():6.2284800183620495E + 18

     

bd.toEngineeringString():6.2284800183620495E + 18

     

bd.toPlainString():6228480018362049500

请参阅live code in IdeOne.com

答案 1 :(得分:1)

打印为6.2284800183620495E18的双精度数字表示 0x43D59C0064EA45A9 = 01000011 11010101 10011100 00000000 01100100 11101010 01000101 10101001

(使用此converter

这意味着它是1.0101100111000000000001100100111010100100010110101001 2 * 2的功率10000111101 2 - 1023 10(见wikipedia了解它是如何工作的) 其中的结果为6082500017931689 * 1024 = 6228480018362049536,这就是你得到的答案。

所以转换为long给出的答案是正确的 - 6228480018362049536是64位整数值的十进制表示,等于给定的双精度值。

这提出了为什么数字的十进制表示为6.2284800183620495E18的问题?

这是因为每个浮点值不代表数字行上的一个点,但是一个范围 - 一位改变(在最后一个地方称为一个单位)将把值改为1024。 从6228480018362049536-512到6228480018362049536 + 511的数字都对应于该相同的双精度值。 Java选择要打印的最小位数的值,该值属于此范围而不是其他 - 6228480018362049000 - 并将其写为科学记数法6.228480018362049E18。

如果您不想要近似值,请按照Basil Bourque的建议使用任意精度,或者(如果您的用例允许)使用基于long的固定点或整数表示。