Misal:
float timeRemaining = 0.58f;
f
Bu numaranın sonunda neden gereklidir?
Misal:
float timeRemaining = 0.58f;
f
Bu numaranın sonunda neden gereklidir?
double & int
.
Yanıtlar:
Şamandıra beyanınız iki bölümden oluşur:
timeRemaining
türde olduğunu bildirir float
.0.58
bu değişkene atar .Sorun 2. bölümde ortaya çıkıyor.
Sağ taraf kendi başına değerlendirilir. C # spesifikasyonuna göre, son eki olmayan bir ondalık nokta içeren bir sayı, bir double
.
Yani şimdi bir double
tür değişkenine atamak istediğimiz bir değerimiz var float
. Bunu yapmak için, 'den' double
e örtük bir dönüşüm olmalıdır float
. Böyle bir dönüştürme yoktur, çünkü dönüştürme sırasında bilgi kaybedebilirsiniz (ve bu durumda kaybedersiniz).
Bunun nedeni, derleyici tarafından kullanılan değerin gerçekten 0,58 olmaması, ancak 0,58'e en yakın kayan nokta değerinin 0,57999999999999978655962351581366 ... için double
ve tam olarak 0,579999946057796478271484375 için olmasıdır float
.
Kesinlikle f
gerekli değildir. f
Değeri a'ya çevirerek soneki kullanmak zorunda kalmayabilirsiniz float
:
float timeRemaining = (float)0.58;
(float) 0.58
çalışacak? Daha önce dönüştürme olmadığını söylemiştiniz, çünkü bilgi kaybolabilir, o zaman oyuncu nasıl çalışır?
2.4
her yerde çift olarak yorumlanır. 2. Örtük daraltma dönüşümlerine (ikiliden kayan noktaya gibi) izin verilmez. Bu kurallara bir istisna yapmak istiyorsanız, o zaman çok iyi bir sebebiniz olmalıdır. 1 tuş vuruşunu kaydetmek, muhtemelen yeterince iyi olmayacaktır.
Derleyici değeri temsil için kullanabileceği birçok sayısal türleri vardır Çünkü 0.58
: float
, double
ve decimal
. Derleyicinin sizin için birini seçmesinde sorun olmadıkça, belirsizliği gidermeniz gerekir.
Belgeleri double
devletler bu derleyici her zaman alır türünü kendiniz belirtmek yoksa double
herhangi bir gerçek sayısal hazır türü olarak:
Varsayılan olarak, atama operatörünün sağ tarafındaki gerçek sayısal değişmez bilgi double olarak kabul edilir. Bununla birlikte, bir tamsayı sayısının çift olarak kabul edilmesini istiyorsanız, d veya D sonekini kullanın.
Son ekin eklenmesi a f
oluşturur float
; sonek a d
oluşturur double
; sonek m
, bir decimal
. Bunların hepsi de büyük harfle çalışır.
Ancak bu, neden derlenmediğini açıklamak için hala yeterli değildir:
float timeRemaining = 0.58;
Cevabın eksik yarısı, 'dan' double
0.58
ye dönüşümün float
timeRemaining
potansiyel olarak bilgiyi kaybetmesidir, bu nedenle derleyici bunu dolaylı olarak uygulamayı reddeder. Açık bir dönüşüm eklerseniz, dönüştürme gerçekleştirilir; f
son eki eklerseniz, dönüştürme gerekmeyecektir. Her iki durumda da kod daha sonra derlenir.
int
ve bir tane double
.
double a = 0.69f;
mı gelir?
float
için double
.
Sorun şu ki .NET, bazı türden örtük işlemlerin gerçekleştirilmesine izin vermek için float
ve double
karma işlenenleri içeren tüm senaryolarda ne olması gerektiğini açıkça belirtmesi ya da türler arasında örtük dönüşümlerin bir işlemde gerçekleştirilmesine izin vermesi gerektiğidir. sadece yön; Microsoft, zaman zaman hassasiyeti tercih eden, ancak sık sık doğruluktan ödün veren ve genellikle güçlük yaratan yöne izin vermek için Java'nın liderliğini takip etmeyi seçti.
Neredeyse tüm durumlarda, double
belirli bir sayısal miktara en yakın değeri almak ve bunu a'ya atamak , aynı miktara en yakın değeri float
verecektir float
. 9,007,199,791,611,905 değeri gibi birkaç köşe durumu vardır; en iyi float
temsil 9.007.200.328.482.816 (536.870.911 ile kapalı), ancak en iyi double
gösterimi (yani 9.007.199.791.611.904) float
9.007.199.254.740.992 (536.870.913 ile kapalı) vermek için kullanmak olacaktır. Genel olarak, yine de, bir double
miktarın en iyi temsilini dönüştürmek float
ya mümkün olan en iyi float
gösterimi ya da esasen eşit derecede iyi olan iki temsilden birini verecektir .
Bu arzu edilen davranışın aşırı durumlarda bile geçerli olduğuna dikkat edin; örneğin, float
10 ^ 308 miktarının float
en iyi double
gösterimi, bu miktarın en iyi temsilini dönüştürerek elde edilen gösterimle eşleşir . Benzer şekilde, float
10 ^ 309'un float
en iyi double
temsili, o miktarın en iyi temsilini dönüştürerek elde edilen gösterimle eşleşir .
Maalesef, açık bir atama gerektirmeyen yöndeki dönüşümler nadiren her yerde bu kadar doğrudur. En iyi dönüştürme float
için değerin temsilini double
nadiren özellikle yakın iyi bir şey verecektir double
örn iyi dönüştürme (yani değerin temsili, ve bazı durumlarda sonuç büyüklük dereceleri yüzlerce kapalı olabilir float
için 10 ^ 40 temsilini double
irade verimi double
10 ^ 300'ün en iyi temsilinden daha büyük olanı karşılaştıran bir değer .
Ne yazık ki, dönüştürme kuralları oldukları gibidir, bu nedenle, değerleri "güvenli" yönde dönüştürürken saçma tip diziler ve son ekler kullanmakla yaşamak ve sıklıkla sahte sonuçlar verecek tehlikeli yöndeki örtük tip yazılara dikkat etmek gerekir.
double
.