2010-03-04 17 views
60

İki sayının - (oldNum - newNum)/oldNum * 100; - arasındaki yüzde farkını hesaplamak için kodum var. Burada her iki sayı da double s. OldNum 0 durumunda bir çeşit kontrol/istisna işleme eklemem gerekiyordu. Ancak, hem oldNum hem de newNum için 0,0 değerinde bir test çalıştırması yaptığımda, hiçbir şey olmamış gibi devam etti ve hiçbir hata atılmadı. Bu kodu int s ile çalıştırmak kesinlikle aritmetik bölünme-sıfır istisna neden olur. Java neden double s olduğunda göz ardı ediyor?Java neden 0.0'a bölerek bir istisna alamıyor?

+4

İyi soru - tamsayı ve çift davranış arasındaki tutarsızlık, karışıklık ve güçlük ekler. –

+2

olası yinelenen [Neden sıfır ile kayan nokta (veya çift duyarlıklı) sayılarla bölme yok java.lang.ArithmeticException:/Java'da sıfır] (http://stackoverflow.com/questions/12954193/why-does- bölme-sıfır-ile-kayan nokta-veya-çift-hassas-sayılar-değil) – Raedwald

+2

@Raedwald - bu sorunun, bağlantı kurduğunuzdan 2 1/2 yıl önce gönderildiğini düşünürsek, bu sorunun (olası) bunun bir kopyası :) – froadie

cevap

42

sıfıra bölme sonucu matematiksel olarak bir çift bir şamandıra/ile ifade edilebilir tanımlanmamış, (NaN olarak - bir sayı), değil, ancak, yanlış bir temel anlamda.

Bir tamsayı belirli bir sayısal değeri tutmalıdır, onlarla uğraşırken bölme sırasında bir hata atılmalıdır.

+6

Tam olarak. Bu, Java Dil Özelliğinde şu adreste tanımlanmıştır: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 –

+1

Sonuç çıktısını denedim ve bu bir NaN değeri. Bu, NaN'i tutamaz anlamına mı geliyor? – froadie

+1

ama bu NaN olan '0.0/0.0' durumunda. –

4

Çift depolamanın yolu int. Java'nın çift hesaplamayı nasıl gerçekleştirdiği hakkında daha ayrıntılı bir açıklama için bkz. http://firstclassthoughts.co.uk/java/traps/java_double_traps.html. Ayrıca, özellikle Not a Number (NaN) konseptinde Kayan Nokta sayılarını da okumalısınız.

Kayan nokta temsili hakkında daha fazla bilgi edinmek istiyorsanız, this document (Word biçimi, üzgünüm) okumanızı öneririz. Anlayışınıza yardımcı olabilecek sayıların ikili temsilini inceler.

101

Java'nın float ve double tipleri, orada (ve hemen hemen herhangi bir donanım FP birimi) hemen hemen başka bir dilde olduğu gibi, özel bir "sonsuzluk" değerini döndürmek için sıfıra bölme zorunlu kılan kayan nokta matematik, için IEEE 754 standardını uygulamak . Bir istisna atmak aslında bu standardı ihlal ederdi.

Tamsayı aritmetiği (Java ve diğer birçok dil ve donanım tarafından two's complement gösterimi olarak uygulanır) farklıdır ve özel bir sonsuzluk veya NaN değerine sahip değildir, bu nedenle istisnalar atmak buradaki yararlı bir davranıştır. Onlar Double.INFINITY, NaN, -0.0 ve bunları içeren aritmetik hesaplamaları yöneten diğer kurallara yeterince dikkat etmezler kayan nokta aritmetik yaparken

+3

Bu sorunun doğru cevabı bu olmalı. Float'ın ve double'un neden istisnalara neden olduğunu bilmem gerekiyordu. Teşekkürler. –

+1

Bu işaretlenmiş doğru cevap olmalıdır.Şu anda doğru olarak işaretlenen cevap, soruya cevap vermiyor ve Java'nın IEEE 754'ü takip ettiğini açıklığa kavuşturmuyor. – Necrototem

3

rağmen Java geliştiricileri, çift ilkel tipi ve Double sınıfa biliyorum.

Bu soruya verilen basit yanıt, ArithmeticException'u atmayacak ve Double.INFINITY döndürecektir. Ayrıca, x == Double.NaN karşılaştırmasının, x'un kendisi bir NaN olsa bile, her zaman false olarak değerlendirdiğine dikkat edin. x bir NaN ise

biri verilen sayı NaN olup olmadığını kontrol etmek için yöntem çağrısı Double.isNaN(x) kullanmalıdır, test etmek için. Bu SQL'da NULL'a çok yakındır.

Size yardımcı olabilir.

1

sıfır (0 veya 0.00) 0 olarak çifte bölerseniz

  1. bölü zaman JVM Sonsuzluk gösterecektir.

    public static void main(String [] args){ double a=10.00; System.out.println(a/0); }

    Konsolu: 0 olarak tarafından int bölerseniz Infinity

  2. ardından JVM Aritmetik İstisna atar.

    public static void main(String [] args){ int a=10; System.out.println(a/0); }

    Konsolu: Exception in thread "main" java.lang.ArithmeticException:/by zero

  3. Ama biz 0.0 ile int bölmek, sonra JVM gösterecektir Infinity:

    public static void main(String [] args){ int a=10; System.out.println(a/0.0); }

    Konsolu: Infinity

Bunun nedeni, JVM'nin otomatik olarak int türünü ikiye katlayacağından, ArithmeticException yerine sonsuzluk elde ederiz.

İlgili konular