1. Gerçek sayıları yuvarlama
Daha önce tartıştığımız gibi, bir değişkene gerçek bir sayı atandığında int
, her zaman en yakın küçük tamsayıya yuvarlanır - kesirli kısım basitçe atılır.
Ancak, kesirli bir sayının her iki yönde de en yakın tamsayıya yuvarlanması veya hatta yukarı yuvarlanması gereken bir durumu hayal etmek kolaydır. Bu durumda ne yaparsın?
Bu ve buna benzer birçok durum için Java , , ve metotlarına Math
sahip bir sınıfa sahiptir .round()
ceil()
floor()
Math.round()
yöntem
Yöntem Math.round()
, bir sayıyı en yakın tamsayıya yuvarlar:
long x = Math.round(real_number)
Ancak burada başka bir nüans daha var: bu yöntem bir long
tamsayı döndürür (bir değil int
). Gerçek sayılar çok büyük olabileceğinden, Java'nın yaratıcıları Java'nın mevcut en büyük tamsayı türünü kullanmaya karar verdiler: long
.
Buna göre, bir programcı sonucu bir değişkene atamak istiyorsa int
, derleyiciye olası veri kaybını kabul ettiğini açıkça belirtmelidir (sonuçta elde edilen sayının bir türe uymaması durumunda int
).
int x = (int) Math.round(real_number)
Örnekler:
İfade | Sonuç |
---|---|
|
|
|
|
|
|
Math.ceil()
yöntem
Yöntem Math.ceil()
, bir sayıyı bir tamsayıya yuvarlar . İşte örnekler:
İfade | Sonuç |
---|---|
|
|
|
|
|
|
Math.floor()
yöntem
Yöntem Math.floor()
, bir sayıyı bir tamsayıya yuvarlar . İşte örnekler:
İfade | Sonuç |
---|---|
|
|
|
|
|
|
Tabii ki, bir sayıyı bir tamsayıya yuvarlarken , bir tip atama operatörünü kullanmak daha kolaydır:(int)
İfade | Sonuç |
---|---|
|
|
Bu isimleri hatırlamakta zorlanıyorsanız, kısa bir İngilizce dersi yardımcı olacaktır:
Math
matematik demektirRound
yuvarlak demektirCeiling
tavan demekFloor
kat anlamına gelir
2. Kayan noktalı sayılar nasıl yapılandırılır?
Tip , ile double
aralığındaki değerleri saklayabilir . Bu geniş değer aralığı (türe kıyasla ), türün ( ve ) tamsayı türlerinden tamamen farklı bir iç yapıya sahip olması gerçeğiyle açıklanır . Dahili olarak, tür, değerini iki sayı olarak kodlar: ilki mantis olarak adlandırılır ve ikincisi üs olarak adlandırılır .-1.7*10308
+1.7*10308
int
double
float
double
Diyelim ki elimizde bir sayı var 123456789
ve onu bir double
değişken olarak saklıyoruz. Bunu yaptığımızda, sayı şuna dönüştürülür ve tür dahili olarak iki sayı depolar - ve . Önem ("sayının önemli kısmı" veya mantis) kırmızı renkle vurgulanırken, üs mavi renkle vurgulanır.1.23456789*108
double
23456789
8
Bu yaklaşım, hem çok büyük sayıların hem de çok küçük sayıların saklanmasını mümkün kılar. Ancak sayının temsili 8 bayt (64 bit) ile sınırlı olduğundan ve bazı bitler üssü depolamak için kullanıldığından ( ayrıca mantisin işareti ve üssün işareti), mantisi temsil etmek için mevcut olan maksimum basamaklar 15 _ _
Bu , gerçek sayıların nasıl yapılandırıldığının çok basitleştirilmiş bir açıklamasıdır.
3. Gerçek sayılarla çalışırken hassasiyet kaybı
Gerçek sayılarla çalışırken, gerçek sayıların kesin olmadığını her zaman aklınızda bulundurun . Ondalıktan ikiliye dönüştürürken her zaman yuvarlama hataları ve dönüştürme hataları olabilir . Ek olarak, en yaygın hata kaynağı, radikal olarak farklı ölçeklerde sayıları toplarken/çıkarırken kesinlik kaybıdır .
Bu son gerçek, acemi programcılar için biraz akıllara durgunluk veriyor.
Çıkarırsak , elde ederiz .1/109
109
109
Tamamen farklı ölçeklerde sayıları çıkarma | Açıklama |
---|---|
|
İkinci sayı son derece küçüktür ve bu, (gri renkle vurgulanan) anlamının göz ardı edilmesine neden olur. 15 önemli basamak turuncu renkle vurgulanmıştır. |
Ne diyebiliriz, programlama matematikle aynı şey değildir.
4. Gerçek sayıları karşılaştırırken yaşanan tuzak
Gerçek sayıları karşılaştırırken programcıları bekleyen başka bir tehlike daha vardır. Gerçek sayılarla çalışırken ortaya çıkar, çünkü yuvarlama hataları birikebilir. Sonuç olarak, gerçek sayıların eşit olmasının beklendiği, ancak eşit olmadığı durumlar vardır. Veya tam tersi: sayıların farklı olması beklenir, ancak eşittirler.
Örnek:
İfade | Açıklama |
---|---|
|
Değişkenin değeri a olacak 1000000000.0 Değişkenin değeri c olacak 1000000000.0 (değişkendeki sayı b aşırı derecede küçük) |
Yukarıdaki örnekte a
ve c
eşit olmamalı, ama eşitler.
Veya başka bir örnek verelim:
İfade | Açıklama |
---|---|
|
Değişkenin değeri a olacak 1.0 Değişkenin değeri b olacak1.0 |
5. Hakkında ilginç bir gerçekstrictfp
Java, diğer programlama dillerinde bulunmayan özel bir anahtar kelimeye (strictfp
katı kayan nokta ) sahiptir. Ve buna neden ihtiyacın olduğunu biliyor musun? Kayan noktalı sayılarla yapılan işlemlerin doğruluğunu kötüleştirir . İşte nasıl ortaya çıktığının hikayesi:
GO TO FULL VERSION