【问题标题】:DecimalFormat - keep all decimal numbersDecimalFormat - 保留所有十进制数字
【发布时间】:2016-10-28 11:50:24
【问题描述】:

我正在使用 DecimalFormat 将双精度数格式化为字符串。 然后将此字符串集成到我的表示层中。

  • 问题:我想保留所有小数。 例如:“12345678.123456789”
  • 问题:我应该使用什么格式?
  • 备注:我使用不同的 Locale 来支持多种布局。

格式: #.## -> 这使用 ALL 数字 BEFORE 小数点,但 >ROUNDS 小数点之后的数字。

我可以使用#.#########作为大小数,但是如果小数更长呢?

我发现我的小测试程序很有用,想与你分享。

你能帮我显示所有小数吗?

package be.softwarelab.numbers;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;

public class DecimalNumbersTest {

    private static final double NUMBER = 123456789.123456789;

    public static void main(String[] args) {

        String format01 = "#.";
        String format02 = "#.#";
        String format03 = "#.##";
        String format04 = "#.###";
        String format05 = "#.####"; 

        System.out.println("====== NUMBER ===== USA =====================================");
        showResult(NUMBER, format01, Locale.US);
        showResult(NUMBER, format02, Locale.US);
        showResult(NUMBER, format03, Locale.US);
        showResult(NUMBER, format04, Locale.US);
        showResult(NUMBER, format05, Locale.US);
        System.out.println("====== NUMBER ===== France ==================================");
        showResult(NUMBER, format01, Locale.FRANCE);
        showResult(NUMBER, format02, Locale.FRANCE);
        showResult(NUMBER, format03, Locale.FRANCE);
        showResult(NUMBER, format04, Locale.FRANCE);
        showResult(NUMBER, format05, Locale.FRANCE);
        System.out.println("=============================================================");
    }

    public static void showResult(double number, String format, Locale locale) {
        // Using a Locale to see the differences between regions.
        DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(locale);
        DecimalFormat formatter = new DecimalFormat (format, otherSymbols);

        // Create the String result
        String output = formatter.format(number);

        // Format the output for a nice presentation.
        System.out.format("    %s %11s = %20s\n", locale, format, output);
    }
}

这会导致:

====== NUMBER ===== USA =====================================
en_US          #. =           123456789.
en_US         #.# =          123456789.1
en_US        #.## =         123456789.12
en_US       #.### =        123456789.123
en_US      #.#### =       123456789.1235
====== NUMBER ===== France ==================================
fr_FR          #. =           123456789,
fr_FR         #.# =          123456789,1
fr_FR        #.## =         123456789,12
fr_FR       #.### =        123456789,123
fr_FR      #.#### =       123456789,1235
=============================================================

编辑:一位用户提到了一个相关问题:How to nicely format floating numbers to String without unnecessary decimal 0? 这个问题并没有解决我的问题,因为它侧重于限制大小,但我需要尽可能长时间地保持它。

【问题讨论】:

  • 感谢您的反馈,但我没有在这个答案中找到我的解决方案。这专注于限制大小,但我需要尽可能长时间地保持它。我的客户需要看到准确性。我也不需要尾随零。
  • 您是否在建议的答案中进行了调查?
  • "我可以使用#.######### 来表示大小数,但如果小数更长怎么办?" => 你到底在测量什么......?它真的精确到小数点后 10 位以上吗?还是这些值只是使用不太精确的数字计算的结果?
  • @Flown:是的,但没有找到解决方案。你有更深刻的见解吗?我应该进一步遵循相关问题的路径吗?我正在研究另一种方式,并随时通知您。

标签: java numbers decimalformat


【解决方案1】:

String.format 可能会在这里帮助您 - NumberFormat

  private static void printfWithLocale(Locale locale, Double d){
    System.out.println("Output locale: " + locale.toString());
    String simpleOutputTeplate = "simpleOutputTeplate: %s";
    String refinedOutputTeplate = "refinedOutputTeplate: %.10f";

    System.out.println(String.format(locale, simpleOutputTeplate, d));
    System.out.println(String.format(locale, refinedOutputTeplate, d));

  }

  public static void main(String[] args) {

    Double d = new Double(3.1234567890123456789);

    printfWithLocale(Locale.US, d);
    System.out.println("");
    printfWithLocale(Locale.FRANCE, d);
  }

代码输出:

Output locale: en_US
simpleOutputTeplate: 3.1234567890123457
refinedOutputTeplate: 3.1234567890

Output locale: fr_FR
simpleOutputTeplate: 3.1234567890123457
refinedOutputTeplate: 3,1234567890

您会注意到 %s(字符串)不符合语言环境,但会将 Double 格式设置为最多 17 个小数点。 使用 String.format,您可以进一步优化数字在字符串中的格式。

【讨论】:

  • 这是否意味着实际上无法使用语言环境直接格式化双精度同时保留所有小数?
【解决方案2】:

由于 double 不能精确地表示某些数字,因此如果您切入给定长度的小数(例如 17)并不重要。请参阅this other question以获取解释How many significant digits have floats and doubles in java?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多