首页 文章

格式化十进制数

提问于
浏览
1

我正在格式化十进制数,我有以下标准来格式化它:

  • 数字最多应为小数点后两位(10.1234 => 10.12)

  • 如果小数点后只有一位数,那么最终会得到一个额外的0(10.5 => 10.50)

  • 千位分隔符将是逗号(12345.2345 => 12,345.23)

我写了以下逻辑:

double x = Double.parseDouble(value.toString());
String dec = x % 1 == 0 ?  new java.text.DecimalFormat("###,###.##").format(x) : new java.text.DecimalFormat("###,###.00").format(x);

现在正在打印:

11111111111110.567=>11,111,111,111,110.57
111111111111110.567=>111,111,111,111,110.56
1111111111111110.567=>1,111,111,111,111,110.60
11111111111111110.567=>11,111,111,111,111,110
111111111111111110.567=>111,111,111,111,111,104
1111111111111111110.567=>1,111,111,111,111,111,170

我不明白为什么行为会改变 . 我应该如何打印 1111111111111111110.567 作为 1,111,111,111,111,111,110.57

2 回答

  • 3

    问题是你不能完全代表1111111111111111110.567作为 double . (你甚至不能准确地表示你的最短值,但随着你增加幅度,不准确性会显着增加 . )

    A double 无论如何只有大约17个有用数据的有效数字 - 你试图得到22位数 .

    如果你想要更高的精度,请使用 BigDecimal - 但要注意这也将改变其他事情 . 无论如何,你想要代表什么样的 Value ?自然值(重量,距离等)适用于 double ;人工 Value (特别是货币 Value )适用于 BigDecimal .

  • 3

    我设法得到了这个(你必须使用 BigDecimal ):

    import java.math.BigDecimal;
    import java.text.NumberFormat;
    
    public class Sandbox {
        public static void main(String[] args) {
            BigDecimal x = new BigDecimal("1111111111111111110.567");
            DecimalFormat formatter = new DecimalFormat("###,###.00");
            System.out.println(formatter.format(x));
        }
    }
    

    OUTPUT:

    1,111,111,111,111,111,110.57
    

    资源链接:DecimalFormatBigDecimal

    还有一件事,你必须输入BigDecimal数字作为 String 否则会导致问题 .

    BigDecimal x = new BigDecimal(1111111111111111110.567) will output the following.
    
    1,111,111,111,111,111,168.00
    

相关问题