【发布时间】:2015-03-24 02:53:08
【问题描述】:
所以我在doubles 之间进行了这种划分(从它在数据库中获取的值);
indPayRatio[loadCounter] = c.getDouble(c.getColumnIndex("payment")) / c.getDouble(c.getColumnIndex("debt_total"));
没有任何一个值可以为空的情况。他们必须在这里。
嗯,有时我会得到这个疯狂的长数字,所以我将它转换为BigDecimal,如下所示:
bdRatio = new BigDecimal(indPayRatio[i]);
在这一行,我从许多用户那里得到了以下堆栈跟踪。我无法复制它,所以我不确定它的价值。
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NumberFormatException: Infinity or NaN: NaN
at java.math.BigDecimal.<init>(BigDecimal.java:465)
at com.---.---.DebtDataSource.payoffDebt(DebtDataSource.java:544)
at com.---.---.PlannerFragment$PlannerTask.doInBackground(PlannerFragment.java:177)
at com.---.---.PlannerFragment$PlannerTask.doInBackground(PlannerFragment.java:143)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4 more
我的第一个预感是,我应该在第一行使用 BigDecimal 进行乘法运算,但如果这是问题所在,为什么在将其转换为 BigDecimal 时会出现错误?
【问题讨论】:
-
如果debt_total 为0怎么办?它会解释你的情况吗? BigDecimal 构造函数:
NumberFormatException - if val is infinite or NaN. -
我从来没想过。尽管从我得到的错误数量来看,在这种情况下,这个值很少会是“0”。我想我只需要用
BigDecimal进行硬除法,这样我就能得到一个很好的价值,而不是一个双倍会失败的价值。 -
没有好/坏的值。如果除数为 0,对于双精度数,您会得到 Infinity,对于 BigDecimals,您会得到一个异常 - 使用 BigDecimal 不会解决问题。您需要决定当除数为 0 时该怎么做。这是我看到此异常被抛出的唯一方法。
标签: java double bigdecimal