格式化十进制数(Formatting Decimal Number)

2019-10-18 12:36发布

我格式化的十进制数,我有以下标准进行格式化:

  • 号码应该是最多两位小数(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.5671,111,111,111,111,111,110.57

Answer 1:

问题是,你不能代表1111111111111111110.567正好为double摆在首位。 (你甚至不能完全代表你的最短值,但是当你增加幅度不准确会显著增加。)

一个double只有有用的数据的约17显著位反正-你正在试图获得22位。

使用BigDecimal ,如果你想更精确-但请注意,这将改变其他的一些东西。 什么样的价值,你想表示,无论如何? 天然的值(权重,距离等)适合于double ; 人工值(特别是货币值)适合BigDecimal



Answer 2:

我设法得到这个(你必须使用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


文章来源: Formatting Decimal Number