【问题标题】:How to convert a BigInteger to a scientific notation string and back?如何将 BigInteger 转换为科学记数法字符串并返回?
【发布时间】:2016-07-22 20:03:30
【问题描述】:

我想将 BigInteger 数字转换为一个小的科学记数法,如 1.86e+6,然后再次将该科学记数法重新转换为 Java 中的 BigInteger 数字。请帮忙。

【问题讨论】:

  • 请提供更多细节。什么是“小”科学记数法?您想要像 1.86E+6 这样的计算机样式输出还是像 1.86×10⁶ 这样的印刷书籍符号?您是否熟悉 Formatter 类,或者您需要解释吗?展示您迄今为止编写的代码的任何尝试都会有所帮助。
  • @Shivansh 您需要展示您已经尝试过的内容,以便人们可以帮助您修复您的代码。请阅读How to Ask a Good Question 并提供minimal reproducible example

标签: java biginteger notation


【解决方案1】:

最简单的方法是使用BigDecimal 来解析或输出科学记数法字符串。

你可以这样做:

BigDecimal bd = new BigDecimal("1.86E+6");
BigInteger bi = bd.toBigInteger();

反过来:

bd = new BigDecimal(bi);
String s = bd.toString();

更新

如果您需要更多用户定义的输出,那么您可以使用NumberFormatter。不要忘记将Locale 设置为Locale.ROOT 之类的东西,这样你就不会得到一个逗号作为小数点分隔符(这是我首先得到的,在德语语言环境中)。示例:

    // Create a large, ugly number.
    BigInteger bi = BigInteger.valueOf(1001).pow(345);
    
    // Convert to scientific notation using invariant Locale.ROOT
    NumberFormat formatter = new DecimalFormat("0.######E0", DecimalFormatSymbols.getInstance(Locale.ROOT));
    String str = formatter.format(bi);
    
    System.out.println(bi);
    System.out.println();
    System.out.println(str);
    
    // No need for a formatter here.
    BigDecimal bd = new BigDecimal(str);
    BigInteger output = bd.toBigInteger();
    
    System.out.println();
    System.out.println(output);

这个的输出是:

1411746534642247386926682895653605505594156007645319584856454985824576909030651172402258145880680847831210464829918490010166811079002972726937057623073994129575640372154237767652434547101885830188958723868572869883365738143353635151476880747344348010706072986535185748982964423793694140085891791220972791882178323235649877119554541663599295787824745711388310165587991341807160511741076029768404282877856115942906536866189181255514197337418597936644390730217525723115231014147849887446040444969336884906158293521291748134217314005889949484320602720371789914893639795254884800520873191697159041280591046403928290350948505388703036712226506136642305960716764124836947362932720418554290195995002114233675196543233402547357577387336805972842986766416381431727078044233139876612983206051371851773391882427929601311695575660371227105236375213782469513349953017524299926322617324052803634576283153878896093739315873095260971811967828941219651149370566639839402498088185721432957408746669159107050035686712174548658001777149571278954599340345001

1.411747E1035

1411747000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

(是的,BigIntegers 可能很笨拙)。

我不知道您的值有多大,但以上在我的 Mac 上运行良好。当然,使用只有几位小数的科学记数法会损失很多精度。

【讨论】:

  • @Shivansh:点击答案左侧数字上方的向上三角形来投票。你也可以用问题来做到这一点
  • 先生,我使用 NumberFormat formatter=new DecimalFormat("0.######E0);String str=formatter.format(mybiginteger); 将 BigInteger 转换为科学记数法。但是当我使用非常非常大的数字,然后在将字符串重新转换为 BigInteger 时,在给出一些数字后,它在 o/p 中仅显示零。请帮助。
  • @Shivansh:抱歉,我完全忘记了这件事。我更新了我的答案。看一看。可能是您的输出包含其他内容作为小数分隔符,例如"1,863457E45" 而不是 "1.863457E45"?在我指定 Locale.Root 之前发生在我身上。
  • 这很好,先生。但是是否有任何其他解决方案可以在不从非常小的科学记数法中得到零的情况下获得精确的原始数字。
  • @Shivansh:不,没有。如果您转换为只有几位数字的字符串,则其余数字将丢失。否则,如果您可以从一个非常短的字符串中检索所有有效数字,您就会找到最终的压缩技术。 而且不用叫我“先生”,只要说“鲁迪”就行了。
猜你喜欢
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多