【问题标题】:Displaying doubles to a certain precision in java在java中显示双精度到一定精度
【发布时间】:2011-04-05 21:39:21
【问题描述】:

我目前正在编写一个计算器应用程序。我知道双倍并不是好的数学的最佳选择。应用程序中的大多数功能都具有很高的精度,但不会得到超级丑陋的结果。我的解决方案是只向用户显示 12 位小数的精度。我选择 12 是因为我的最低精度来自我的数值派生函数。

我遇到的问题是,如果我将它乘以定标器,然后舍入然后除以定标器,则精度很可能会失控。如果我使用 DecimalFormat,则无法仅显示 12 并正确显示科学记数法的 E,但如果不需要,则不会出现。

例如我想要

1.23456789111213 to be 1.234567891112

但从来没有

1.234567891112E0

但我也想要

1.23456789111213E23 to be 1.234567891112E23

所以基本上我想将数字字符串格式化为小数点后 12 位,保留科学记数法,但在不应该的时候不科学

【问题讨论】:

  • 看看你在做什么?走捷径会导致努力工作!您知道 double 不是正确的选择,但是当您习惯了它时,您愿意尝试克服 double 的问题,事实上,您应该学习如何使用 BigDecimal(如建议的那样!)

标签: java numbers double precision


【解决方案1】:

使用String.format("%.12G", doubleVariable);

这就是您使用 format() 以科学计数法显示值的方式,但如果不需要,则不使用科学计数法。需要注意的是,您最终会在“E”之后添加一个“+”,因此您的最终会像 1.234567891112E+23

【讨论】:

  • 谢谢,我有点喜欢 +,如果您不想显示为 Justin Waugh,我会将您的名字添加到应用程序中的“感谢”列表中跨度>
【解决方案2】:
String.format("%.12d", doubleVariable);

应该在您的第一件事中为您提供您正在寻找的东西。抱歉,我不知道如何定义您的电子通知何时显示。

【讨论】:

    【解决方案3】:

    您会对 BigDecimal 感兴趣,例如:

    BigDecimal number = new BigDecimal("1.23456789111213");
    number = number.setScale(12, RoundingMode.HALF_UP);
    System.out.println(number);
    

    选择适合你的 RoundingMode。

    【讨论】:

    • 这对1.23456789111213E23 有什么帮助?
    • BigDecimal 有 toEngineeringString 方法可以帮助您使用这种表示法 - 但在这个解决方案中,您应该决定是否要显示科学计数法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多