İ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?
cevap
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.
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 –
Sonuç çıktısını denedim ve bu bir NaN değeri. Bu, NaN'i tutamaz anlamına mı geliyor? – froadie
ama bu NaN olan '0.0/0.0' durumunda. –
Ç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.
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
Bu sorunun doğru cevabı bu olmalı. Float'ın ve double'un neden istisnalara neden olduğunu bilmem gerekiyordu. Teşekkürler. –
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
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
Double.isNaN(x)
kullanmalıdır, test etmek için. Bu
SQL
'da
NULL
'a çok yakındır.
Size yardımcı olabilir.
sıfır (0 veya 0.00) 0 olarak çifte bölerseniz
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
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
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.
- 1. __str__, str neden ikinci bir parametre alamıyor?
- 2. 'DefaultInlineConstraintResolver' neden 'apiVersion' çözümünü alamıyor
- 3. Java EE Filtreler çerez alamıyor mu?
- 4. Beklenmeyen uyumsuzluk yöntemleri neden istisna atmıyor?
- 5. Bir çizginin uzunluğunu bölerek ve bu alanı
- 6. Arrays.fill() yöntemi bir istisna neden olur
- 7. java istisna atmak dönüş
- 8. Java Girdi uyuşmazlığı istisna
- 9. Neden istisna burada tetiklenmiyor?
- 10. JSR-223 kullanarak ScriptException neden Java istisna nasıl erişilir
- 11. Böyle bir dizenin içeriğini değiştirmemize neden bir istisna neden olur?
- 12. Bu program neden bir istisna yakalayamıyor?
- 13. Neden bir istisna farklı sayfalara yönlendiriyor?
- 14. java IO İstisna: Akış Kapalı
- 15. Java arayüzü bir istisna atar ancak arayüz uygulaması bir istisna alamaz?
- 16. Python'da neden bir hata mesajı alıyorum NoneType 'adını alamıyor?
- 17. Neden ... neden incelikle başarısız ... ama bir istisna atmak için?
- 18. 'bir istisna
- 19. bir istisna
- 20. başka düzeyde bir klasörden bir sınıf alamıyor
- 21. pygame'i alamıyor
- 22. maven'den java programını çalıştırmaya çalışırken istisna
- 23. Neden bir null dönüşü sınanabilir, ancak başka bir istisna atar?
- 24. Hive Birliği ALL - java nullpointer istisna
- 25. Java dom4j org/jaxen/Ad AlanıSonraki istisna
- 26. , selenium ile metin alamıyor
- 27. Bir istisna, istisna yapıldığında yükseltilip alındığında nasıl istisna geçirilir?
- 28. Derleyici eklemeden önce derleyici otomatik şablon parametresini neden alamıyor?
- 29. Neden ilk paragraf bu stili alamıyor p: first-child?
- 30. Neden istisna mesajında bilgi eklemek için çalışmıyor?
İyi soru - tamsayı ve çift davranış arasındaki tutarsızlık, karışıklık ve güçlük ekler. –
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
@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