循环时大十进制

时间:2013-04-19 20:55:16

标签: java while-loop bigdecimal

我有一个使用整数的while循环,但我将它转换为一个大的Decimal,因为该值很高,我不确定如何使我的while循环使用一个大的Decimal而不是一个整数我的代码如下。

public String getsize()
{
  BigDecimal size = new  BigDecimal(mySize);
  int count = 0;
  String dataType = "";
while (size > 1000 )
  {   
   size = size.divide(size, 1000);
   count++;
  } 
  switch (count)
  {
    case 0:
    dataType = "Bytes";
    break;
    case 1:
    dataType = "KB";
    break;
    case 2:
    dataType = "MB";
    break;
    case 3:
    dataType = "GB";
    break;
    case 4:
    dataType = "KB";
    break;    
  }   
    return size + dataType ;
} 

错误位于行的同时(大小> 1000),因为如果size是整数,则这是方法。有人可以告诉我使用大十进制大小的方法吗?我遇到了一些麻烦 编辑:给出的解决方案,现在我的分界线中出现了一个无关的问题我得到:“线程中的异常”主“java.lang.IllegalArgumentException:无效的舍入模式”任何想法如何解决这个问题?我认为最好在这里发帖,然后提出一个全新的问题,但如果那是正确的,那么就这样做。

5 个答案:

答案 0 :(得分:2)

要比较BigDecimals,请使用compareTo方法; BigDecimalComparable。如果compareTo大于sizethousand方法将返回大于0的整数。

BigDecimal thousand = new BigDecimal(1000);
while (size.compareTo(thousand) > 0 )

顺便说一句,看起来你没有正确地进行BigDecimal分割:

size = size.divide(size, 1000);

这会将1000解释为rounding mode,这会产生IllegalArgumentException。我认为你只需要分开它:

size = size.divide(thousand);  // see above for BigDecimal "thousand" declaration

此外,案例4不正确;在除以1000 4倍(数万亿)之后,对于太字节应该是“TB”:

case 4:
dataType = "TB";
break; 

答案 1 :(得分:2)

您必须在BigDecimal中包装您比较的值,并将其与compareTo方法进行比较:

BigDecimal limit = new BigDecimal("1000");
while (size.compareTo(limit) > 0 ) {
    ...
}

答案 2 :(得分:2)

你需要这样做:

BigDecimal compareVal = new BigDecimal(1000);
while(size.compareTo(compareVal) > 0) {
    ...
}

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#compareTo(java.math.BigDecimal)

答案 3 :(得分:1)

compareTo(BigDecimal another)

http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#compareTo(java.math.BigDecimal)

BigDecimal k = new BigDecimal("1000");
while(size.compareTo(k)>0)....

答案 4 :(得分:1)

使用此:

while (size.compareTo(new BigDecimal(1000)) > 0) {
    // ...
}

更好的是,将1000值定义为局部变量:

final BigDecimal _1000 = new BigDecimal(1000);
while (size.compareTo(_1000) > 0) {
    // ...
}