men*_*ics 15 java number-formatting
内置的DecimalFormat仅允许您指定小数点右侧的位数.
由于将数字表示为double的限制,数字格式化需要在其中包含一定程度的舍入.在一般情况下,舍入必须是多个有效数字(默认情况下是双精度),否则你的格式化双精度将最终显示像3.5999999而不是3.6的东西.
我能找到的最接近的解决方案是使用
new BigDecimal(double, new MathContext(14, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString()
Run Code Online (Sandbox Code Playgroud)
但是,这只提供单一格式.如果我需要通常格式化它(组分隔符,小数点分隔符,限制数字位数,填充等),JDK库中没有任何内容.
是否有一个通用数字格式库,可以正确处理有效数字的舍入?
有人问了一些例子.所以,假设我想格式化为4位有效数字,然后:
0.000003599999 -> 0.0000036
4.12345 -> 4.123
1234.345 -> 1234
Run Code Online (Sandbox Code Playgroud)
我们采取的一般方法是舍入到14位数,因为根据情况,双倍只能代表大约15-17位有效数字(或者我已经读过).
Sha*_*ane 11
这会增加很多开销(大约5 MB),但是International Components for Unicode项目有一个增强的DecimalFormat,可以很好地处理有效数字.
http://icu-project.org/apiref/icu4j/com/ibm/icu/text/DecimalFormat.html#sigdig
DecimalFormat formatter = new DecimalFormat();
formatter.setMaximumSignificantDigits( 4 );
System.out.println( formatter.format( hoursSinceLastAccident ) );
Run Code Online (Sandbox Code Playgroud)
这样的解决方案怎么样:
double l = 34563.35129854289;
short offset = (short) Math.ceil(Math.log10(l) + 1);
short significantDigits = 10;
System.out.printf("%,." + (significantDigits - offset) + "f", l);
//String output = String.format("%,." + (significantDigits - offset) + "f", l);
Run Code Online (Sandbox Code Playgroud)
输出:
34 563,3513(即printf中的','表示使用组分隔符)
值得一提的是,如果目标是Android而不是 Java,则内置DecimalFormat支持通过符号对有效数字进行格式化@。
String smallPi = new DecimalFormat("@@@").format("3.14159"); // formats number as '3.14'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9765 次 |
| 最近记录: |