我有以下代码6.2284800183620495E18
单元格值为6228480018362050000
我得到的输出是......
现在我不是专家,但是我使用this输出6228480018362049536 6.2284800183620495E18 6.2284800183620495E18
,我希望这样,但是Java给了我......
6228480018362049536
为什么6228480018362050000
而非DisplayAlert()
以及如何获得实数?
我正在使用Java8
答案 0 :(得分:2)
float
,Float
,double
和Double
类型都使用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
答案 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的固定点或整数表示。