Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın Türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi

0
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

Açık 1 Cevaplar 36 Gösterim Java

Aşağıda yazdığım kod hata alıyor. Nedeni ve çözümü hakkında fikriniz var mı?

import java.math.BigDecimal;

public class BigDecimalBoluUc {
	public static void main(String[] args) {
		var bir = new BigDecimal(1);
		var uc = new BigDecimal(3);

		System.out.print(bir.divide(uc));
	}
}

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

1 cevap

0

BigDecimal değer üzerindeki virgülden sonraki sayıları kaybetmeyi sevmiyor. 1/3 dediğimiz zaman 0.333 sonucu çıkıp 3 ler sonsuza gidince de bu hatayı veriyor.

Bunu düzeltmek için aşağıdaki gibi BigDecimal sınıfına bu durumda nasıl davranması gerektiği söylenmelidir.

public static void main(String[] args) {
  BigDecimal bir = BigDecimal.valueOf(1l);
  BigDecimal uc = BigDecimal.valueOf(3l);
  System.out.println(bir.divide(uc, MathContext.DECIMAL128));
}

BigDecimal.divide metodu iki parametre alıyor. Birincisi bölen değerimiz, diğeri de nasıl davranacağı hakkında bilgi. Mesela RoundingMode.FLOOR değerini ikinci parametreye verip sonucu direk yuvarlayabilirsiniz. Up deyip yukarı Down deyip aşağı çekebilirsiniz. Ama ben virgülden sonrasında belirli karaktere kadar destekleyeceğim derseniz MathContext.DECIMAL128 güzel bir seçenek olacaktır.

Yuvarlama örneği olarak

System.out.println(bir.divide(uc, RoundingMode.FLOOR));

(5.2k puan)