12 Mayıs 2017 Cuma

BigDecimal Sınıfı

Constructor - double
Açıklaması şöyle
When a double must be used as a source for a BigDecimal, note that this constructor provides an exact conversion; it does not give the same result as converting the double to a String using the Double.toString(double) method and then using the BigDecimal(String) constructor. To get that result, use the static valueOf(double) method.
BigDecimal double ile kurulursa hatalı sonuç gösterebilir.

Örnek
System.out.println(new BigDecimal(58.34));
Bu kod çıktı olarak 58.340000000000003410605131648480892181396484375 sayısını verir.
Çünkü 58.34 sayısı double ile tam temsil edilemez.

Örnek
BigDecimal bd = new BigDecimal(0.7d);
Çıktı olarak şunu alırız.
0.6999999999999999555910790149937383830547332763671875
Çözüm
Bu metod yerine BigDecimal.valueOf() kullanılması öneriliyor.
BigDecimal.valueOf (0.015)
Hatta dokümantasyonda şöyle yazıyor.
This is generally the preferred way to convert a double (or float) into a BigDecimal.
valueOf alt tarafta şuna benzer bir şekilde çalışıyor. Yani verilen double sayısı string'e çevriliyor. String'e çevrimde "shortest decimal representation" seçildiği için 0.015 aslında double ile tam temsil edilemese bile string'e çevrimde 0.015 çıktığı için doğru BigDecimal değeri elde ediyoruz.
new BigDecimal (Double.toString(0.015))
Constructor - double + MathContext
Şöyle yaparız. Yuvarlama işlemine tabi tutar. double tam temsil edilemese bile yuvarlamak işlemine tabi tutulduğu için doğru sonucu alırız.
BigDecimal bd = new BigDecimal(0.7d, MathContext.DECIMAL32);
BigDecimal bd = new BigDecimal(0.7d, MathContext.DECIMAL64)
Constructor - String
BigDecimal mümkünse string ile yaratılmalıdır. Aşağıdaki kod çıktı olarak 58.34 sayısını verir.
System.out.println (new BigDecimal ("58.34"));
String scientific notation olarak ta verilebilir. Şöyle yaparız.
BigDecimal bd = new BigDecimal ("1.00E-7"); 
Şöyle yaparız
BigDecimal bd = new BigDecimal("4.30000000e+01");
compareTo metodu
İki BigDecimal nesnesini karşılaştırır.
BigDecimal bd = new BigDecimal("12");
bd.compareTo (new BigDecimal(0));  //Returns 1
Şu şekilde bir sürü yardımcı metod kullanılabilir.
public class BigDecimalUtil {

  public static boolean isZero(BigDecimal value) {
    return value == null?false:value.compareTo(BigDecimal.ZERO) == 0;
  }   

  public static boolean isPositive(BigDecimal value) {
    return value == null?false:value.compareTo(BigDecimal.ZERO) > 0;
  }

  public static boolean isNegative(BigDecimal value) {
    return value == null?false:value.compareTo(BigDecimal.ZERO) < 0;
  }

  public static boolean isEqual(BigDecimal value1, BigDecimal value2) {
    return value1.compareTo(value2) == 0;
  }

  public static boolean isLessThan(BigDecimal value1, BigDecimal value2) {
    return value1.compareTo(value2) < 0;
  }

  public static boolean isMoreThan(BigDecimal value1, BigDecimal value2) {
    return value1.compareTo(value2) > 0;
  }
}
divide metodu
Şöyle yaparız
BigDecimal x = new BigDecimal("4.8");
BigDecimal y = new BigDecimal("7.11");
BigDecimal z = x.divide(y, 0, RoundingMode.HALF_UP);
doubleValue metodu
Şöyle yaparız.
double myDouble = bd.doubleValue();
floatValue metodu
Şöyle yaparız.
float myFloat = bd.floatValue();
intValue metodu
Şöyle yaparız.
int myInt = bd.intValue();
precision metodu
Açıklaması şöyle. Kaç tane hane olduğunu döndürür.
The precision is the number of digits in the unscaled value. The precision of a zero value is 1.
Şöyle yaparız.
scala> new java.math.BigDecimal("500").precision()
res0: Int = 3
Şöyle yaparız.
if(bd.precision() <= 3) {...}
setScale metodu
Belirtilen küsürat sayısını kullanan yeni bir nesne döner. Round metoduna benzer.
BigDecimal bd = new BigDecimal ("1.01234");
System.out.println (bd.setScale(2, RoundingMode.HALF_UP));//Sonuç 1.01
stripTrailingZeros
Sondaki sıfırları atar.
new BigDecimal("1.2300").stripTrailingZeros() 
Sonuç olarak şunu alırız.
1.23
toBigInteger metodu
BigInteger nesnesine çevirir. Şöyle yaparız.
bd.toBigInteger();
toPlainString
Açıklaması şöyle
toPlainString() - Returns a string representation of this BigDecimal without an exponent field.
Nesneyi stringe çevirir.
BigDecimal bd = ...;
bd.toPlainString();
Şöyle yaparız.
BigDecimal bd = new BigDecimal("1.00E-7"); 
System.out.println(bd.toPlainString());
Çıktı olarak şunu alırız.
"0.0000001"
valueOf metodu
Açıklaması şöyle
Note: This is generally the preferred way to convert a double (or float) into a BigDecimal, as the value returned is equal to that resulting from constructing a BigDecimal from the result of using Double.toString(double).





Hiç yorum yok:

Yorum Gönder