2013-07-14 17 views
12

Ben bir bakışta kolayca "iki katrilyon" olarak 2e15 okuyabilir, ancak 2000000000000000 için daha uzun sürer sıfırları, saymak zorunda ve hatalara yol açabilir.Java: Neden bilimsel notasyon kullanarak tamsayı türlerini bildiremiyorum?

neden bir int veya long2e9 veya 1.3e6 gibi bir hazır bilgi böyle kullanılarak beyan edemez? Ben 1.0003e3 gibi 10 bir negatif güç gibi 2e-3 veya ondalık basamak sayısından daha azdır bir güç 10, bir kayan noktalı sayı üretecektir anlıyorum ama Java değil neden böyle bildirimleri izin ve Kayan nokta parçasını kesip, sonuçta ortaya çıkan değerin integral olmadığı durumlarda hafif bir uyarı verir mi?

bu kötü bir fikir ya da bu tip güvenliği ile ilgili tüm olmasının bir teknik sebebi var mı? Eğer bilimsel gösterim kullandığınızda size a floating point number (çift oluşturmak çünkü derleyici basitçe It

long x = 2e12

long x = 2000000000000 //OK for long olarak ve int y = 2.1234e3

+7

[Eric Lippert'ın] (http://blogs.msdn.com/b/ericlippert/archive/2012/04/ 03/10251901.aspx): "Derleyicinin neden bu özelliği veya bu özelliği uygulamadığı sorusu sık sık sorulur ve tabiki cevap her zaman aynıdır: ** çünkü kimse onu uygulamamıştır. ** Özellikler kullanılmaz olarak başlatılıyor ve sadece insanlar onları uygulamak için çaba harcadıklarında hayata geçirilirler: hiçbir çaba, özellik yok, bu elbette tatmin edici bir cevap değil, beca genellikle soruyu soran kişi, bu özelliğin o kadar bariz bir şekilde iyi olduğu varsayımını yapmış olup, ** bunu uygulamamak için bir nedene sahip olmamız gerekir. ” –

+0

@BrianRoach: Tam sayının ne olduğunu biliyorum.Kayan nokta biçiminde ifade edilen ancak bir ** integral ** değerini değerlendiren sayıların neden özel bir sebebi var mı diye soruyordum: 2.3e3 == 2300', açık bir döküm olmadan atanamaz. Belki de neden sadece John Kugelman'ın alıntı yaptığıdır. Bu mantıklı olur. Sormamın sebebi, böyle bir özelliğin kötü bir fikir olmasının teknik bir sebebi olup olmadığını merak etmekti. – odougs

+0

Hayır, ilk parçayı aldım ... ama bu senin ikinci örneğiniz değil; 'int y = 2123.4' –

cevap

16

int y = 2123.4 //warning: loss of precision olarak gibi bir ifade ayrıştırmak için Önemsiz olmaz senin örnek). Ve bir tamsayıya bir kayan nokta atayamazsınız (bu, ilkel bir dönüşüm olan which is not a valid assignment conversion).

int y = 2d; //can't convert double to int 

Birkaç seçenek var:

Yani bu iki örneğin işe yaramaz Java'nın 7+ kullanımı ile int y = (int) 2e6;

  • :
    • açıkça bir tam sayıya kayan nokta döküm bin ayırıcı: int y = 2_000_000;
  • +0

    Bahsettiğiniz seçeneklerin kullanımı kolaydır ve bahsettiğim varsayımsal özelliklere olan ihtiyacı ortadan kaldırır. Teşekkürler! – odougs

    +4

    Bin ayırıcıya dikkat çekmek için harika bir ek. – Kong

    +0

    @assylias Evet, ancak bir sayı noktası olmayan ve "d" veya "f" soneki olmayan bir sayının bir "int" olduğu varsayılır. Bu yüzden OP'nin örneğin neden 2e8'in bir 'int' olarak yorumlanmayacağını ve neden 2e12l'in 'uzun' olarak yorumlanmayacağını soruyordum (bilimsel gösterim numaraları yorumlanır). Öyleyse cevap şöyle görünüyor: “Java derleyici tasarımcılarının bu konuda sci notasyonu kullandıkları konusunda teknik bir neden yok. OP'nin önerdiği gibi şeyler yapabildiler, ama yapmadılar - belki de bunu yapmayı düşünmediler. bu tarafta." – yroc

    1

    o Java'nın bir eksiklik olduğu için. Özellikle, açıkça, ints ve longs tarafından tam olarak temsil edilen bilimsel gösterim ile temsil edilen bir dizi açıklık vardır ve bu değişmezleri ints ve longs olarak ifade etmenin bir yolunu arzulamak mantıklıdır. 't tüm bilimsel gösterim değişmezdir çünkü ille çünkü Java'nın dil tanımının yüzen yapmanın bir yolu.)