首页 > 解决方案 > 如何保持用户输入的精度?

问题描述

我想创建一个计算器。出于说明目的,让我将问题简化如下。

import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class NumberFormating {
    public static void main(String[] argas) {
        List<String> sInputs = new ArrayList<String>();

        sInputs.add("12345.67890");
        sInputs.add("12345678901234.5");
        sInputs.add("123456789012.345");
        sInputs.add("1234567890.12345");
        sInputs.add("123456.789012435");
        sInputs.add("1.23456789012345");
        sInputs.add("0.00123456789012");
        sInputs.add("0.0012345");

        for (String s : sInputs) {
            BigDecimal number = new BigDecimal(s);
            number = number.round(new MathContext(15, RoundingMode.HALF_UP));

            DecimalFormatSymbols symbols = new DecimalFormatSymbols();
            symbols.setGroupingSeparator(' ');

            DecimalFormat df = new DecimalFormat("#,###.##", symbols);

            System.out.println(df.format(number));
        }
        System.out.println("==== END ====");
    }
}

我想获得具有数字分组和用户输入的原始精度的输出。最大精度为 15。

意外结果(左)和预期结果(右)如下:

12 345.68            --> 12 345.67890
12 345 678 901 234.5 --> 12 345 678 901 234.5
123 456 789 012.34   --> 123 456 789 012.345
1 234 567 890.12     --> 1 234 567 890.12345
123 456.79           --> 123 456.789012435
1.23                 --> 1.23456789012345
0                    --> 0.00123456789012
0                    --> 0.0012345

请问如何实现这样的要求?

奖励:如果您可以对小数部分(小数点后的数字)进行数字分组,那就更好了。

标签: java

解决方案


你得到上面的结果是因为你定义了DecimalFormat df = new DecimalFormat("#,###.##", symbols);两个小数点。你可以使用这样的东西来获得你想要的结果,

DecimalFormat df = new DecimalFormat("#,###.###############", symbols);

推荐阅读