-2

我有一些代码可以检查我的号码有多少位小数。

例子:

1,10正确转换:String.format("%.1f", Double.parseDouble(md.get("amount"))

1,10错误转换:String.format("%.2f", Double.parseDouble(md.get("amount"))

我不能有尾随0

1正确转换:String.format("%.0f", Double.parseDouble(md.get("amount"))

1错误转换:String.format("%.1f", Double.parseDouble(md.get("amount"))

我不能有尾随0

对于大于 1 000 000 的数字,Java 将我的数字转换为科学记数法,而我知道将它们转换回来而不丢失小数的唯一方法是使用 String.format。

我的错误代码:

md 是一个映射,键“数量”映射到一个应该是 Double 的字符串

if( Double.parseDouble(md.get("amount")) * 10 % 10 != 0) {
  System.out.println("0,1");
  md.put("amount", String.format("%.1f", Double.parseDouble(md.get("amount"))));
  if( Double.parseDouble(md.get("amount")) * 100 % 10 != 0) {
    System.out.println("0,11");
    md.put("amount", String.format("%.2f", Double.parseDouble(md.get("amount"))));
  }
}
else if(Double.parseDouble(md.get("amount")) * 10 % 10 == 0 && Double.parseDouble(md.get("amount")) * 100 % 10 == 0){
  System.out.println("0,0");
  md.put("amount", String.format("%.0f", Double.parseDouble(md.get("amount"))));
}
4

3 回答 3

0
String s = md.get("amount").replaceFirst("(\\.(\\d*[1-9])?)0+$", "$1");

双精度值只是一个近似值,0.1 并不准确:0.09999987 等。

通常会使用带有 toPlainString 的 BigDecimal 来表示非科学记数法。

于 2020-01-07T12:59:38.903 回答
0

要查找您有多少个小数,您可以使用 BigDecimal 中的 scale()。因为您的数字是一个字符串,所以您必须转换为 BigDecimal。

Map<String, String> map = new HashMap<>();
map.put("amount", "1000000.23321312");

System.out.println(new BigDecimal(map.get("amount")).scale());

显示值为:8

于 2020-01-07T13:08:32.573 回答
0

你试过正则表达式吗?

        double[] v = { 221, 22.1, 22.11 };
        Locale.setDefault(Locale.GERMANY);

        for (double val : v) {
            String str = String.format("%.2f", val);
            str = str.replaceAll("(.*?)0*$", "$1").replaceAll("(.*?)\\,$", "$1");

            System.out.println(str);
        }

  1. 第一个 replaceAll 删除尾随的 0
  2. 第二个 replaceAll 删除尾随小数点。
于 2020-01-07T13:10:51.680 回答