首页 > 解决方案 > 为什么即使定义为 double 也会引发此 numberformat 异常

问题描述

甲酸被定义为双对吗?有没有更好的方法来做到这一点而不使用大小数?也许在 Math 环境下,这个铸件不是那么好。那么当 halfup 表示下一个整数时,为什么会抛出它?

static String abfallEimer(double d, boolean runden)
    {
        String s = "";

        NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
        nf.setGroupingUsed(true);
        nf.setRoundingMode(RoundingMode.HALF_UP);

        // BigDecimal bd = new BigDecimal(d);
        // bd = bd.setScale(0, RoundingMode.HALF_UP);
        // d = bd.longValueExact();
        d = new Long(nf.format(d));

        if (d > 1000 && !runden)
        {
            long kaki = Math.round(d / 1000) * 1000;

            if (d > 1000000)
            {
                kaki /= 1000000;
                s = nf.format(kaki) + " Mill.";
                return s;
            }
            else
            {
                s = nf.format(kaki);
                return s;
            }
        }
        else
        {
            long kaki = (long) d;
            s = NumberFormat.getInstance(Locale.GERMAN).format(kaki);
            return s;
        }

    }```

线程“JavaFX 应用程序线程”java.lang.NumberFormatException 中的异常:对于输入字符串:java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) 的 java.base/java.lang 中的“1,5” .Long.parseLong(Long.java:707) at java.base/java.lang.Long.(Long.java:1344) at GBO/gui.country.combo.Country.abfallEimer(Country.java:82) at GBO /gui.country.combo.CountryInfo.lambda$0(CountryInfo.java:124) 在 javafx.base/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:360) 在 ...

标签: javaexception

解决方案


我认为问题出在这一行:

  d = new Long(nf.format(d));

您正在做的是将 a 转换double为字符串...其中包含小数点...然后尝试将其解析为整数。自然,整数解析器会抛出异常。

(这可以通过阅读您添加的异常 + 堆栈跟踪来确认,其中甚至包括它试图解析的字符串。)

Long(String)Java 11 中的 javadoc 是这样说的:

已弃用。很少使用这个构造函数。用于parseLong(String)将字符串转换为long基元,或用于valueOf(String)将字符串转换为Long对象。

构造一个新分配的Long对象,该对象long表示由 String 参数指示的值。字符串以与基数 10long的方法完全相同的方式转换为值。parseLong

这就解释了为什么你的代码会抛出异常。

我不清楚的是你在这条线上实际上试图做什么。如果您只是尝试将 a 转换double为 a long,则有更简单的方法可以做到;

   long l = (long) d;       // truncates towards zero; see the
                            // JLS 4.2.4 explanation of IEE 754
                            // "round towards zero" conversions.
   long l = Math.round(d);  // rounds, biased to +infinity; see javadoc

推荐阅读