将大科学数转换为长数

Posted

技术标签:

【中文标题】将大科学数转换为长数【英文标题】:Converting large scientific number to long 【发布时间】:2017-06-19 13:32:40 【问题描述】:

我现在花了很长时间,试图在java中转换数字1.2846202978398e+19,但没有任何运气。目前我正在尝试做(long)Double.parseDouble(hashes),但是这给出了9223372036854775807,这显然是不正确的。实际数字应该类似于 12855103593745000000。

使用int val = new BigDecimal(stringValue).intValue(); 会返回-134589568,因为它无法保存结果。将代码切换到 long val = new BigDecimal(hashes).longValue(); 给我 -5600541095311551616 这也是不正确的。

我假设这是由于 double 的大小与 long 相比而发生的。

有什么想法吗?

【问题讨论】:

大十进制??大整数?? Java: Convert scientific notation to regular int的可能重复 更新问题以反映您的 cmets :) 12_855_103_593_745_000_000 > 9_223_372_036_854_775_807 (Long.MAX_VALUE) @Jazerix 使用 BigDecimal/BigInteger 的建议并不意味着您应该从 double 变为 long via BigDecimal/BigInteger!直接使用 BigInteger,忘记 long:它还不够长。 【参考方案1】:

您是否尝试使用String.format

String result = String.format("%.0f", Double.parseDouble("1.2846202978398e+19"));
System.out.println(result);

输出

12846202978398000000

编辑

为什么不使用BigDecimal 进行算术运算,例如:

String str = "1.2846202978398e+19";
BigDecimal d = new BigDecimal(str).multiply(BigDecimal.TEN);
//                                 ^^^^^^^^------example of arithmetic operations


System.out.println(String.format("%.0f", d));
System.out.println(String.format("%.0f", Double.parseDouble(str)));

输出

128462029783980000000
12846202978398000000

【讨论】:

行得通!但是这个解决方案不允许我做任何算术运算^^ @Jazerix 为什么你不使用BigDecimal 并且结果显示它像我一样? BigInteger 和 BigDecimal 可以直接传递给 String.format;无需使用 parseDouble。 感谢@KlitosKyriacou 提供的信息,我已经对其进行了编辑:)【参考方案2】:

您的值超过了long 的最大大小。在这种情况下,您不能使用long。 试试看

BigDecimal value = new BigDecimal("1.2846202978398e+19");

之后就可以调用

value.toBigInteger()

 value.toBigIntegerExact()

如果需要。

【讨论】:

【参考方案3】:

怎么样:

System.out.println(new BigDecimal("1.2846202978398e+19").toBigInteger());

【讨论】:

以上是关于将大科学数转换为长数的主要内容,如果未能解决你的问题,请参考以下文章

如何将任何数字转换为长数

长数转换格式

在 hive 中将 bigint 转换为科学数

php str_replace 将整数转换为科学数

将具有科学计数法的字符串列表转换为十进制数

在pandas python中将指数或科学数转换为整数