Misal:
float timeRemaining = 0.58f;
fBu numaranın sonunda neden gereklidir?
Misal:
float timeRemaining = 0.58f;
fBu numaranın sonunda neden gereklidir?
double & int .
Yanıtlar:
Şamandıra beyanınız iki bölümden oluşur:
timeRemainingtürde olduğunu bildirir float.0.58bu 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 doubletür değişkenine atamak istediğimiz bir değerimiz var float. Bunu yapmak için, 'den' doublee ö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 doubleve tam olarak 0,579999946057796478271484375 için olmasıdır float.
Kesinlikle fgerekli değildir. fDeğ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.4her 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, doubleve decimal. Derleyicinin sizin için birini seçmesinde sorun olmadıkça, belirsizliği gidermeniz gerekir.
Belgeleri doubledevletler bu derleyici her zaman alır türünü kendiniz belirtmek yoksa doubleherhangi 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 foluşturur float; sonek a doluş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.58ye dönüşümün float timeRemainingpotansiyel 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; fson eki eklerseniz, dönüştürme gerekmeyecektir. Her iki durumda da kod daha sonra derlenir.
intve bir tane double.
double a = 0.69f;mı gelir?
floatiçin double.
Sorun şu ki .NET, bazı türden örtük işlemlerin gerçekleştirilmesine izin vermek için floatve doublekarma 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, doublebelirli bir sayısal miktara en yakın değeri almak ve bunu a'ya atamak , aynı miktara en yakın değeri floatverecektir float. 9,007,199,791,611,905 değeri gibi birkaç köşe durumu vardır; en iyi floattemsil 9.007.200.328.482.816 (536.870.911 ile kapalı), ancak en iyi doublegösterimi (yani 9.007.199.791.611.904) float9.007.199.254.740.992 (536.870.913 ile kapalı) vermek için kullanmak olacaktır. Genel olarak, yine de, bir doublemiktarın en iyi temsilini dönüştürmek floatya mümkün olan en iyi floatgö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, float10 ^ 308 miktarının floaten iyi doublegösterimi, bu miktarın en iyi temsilini dönüştürerek elde edilen gösterimle eşleşir . Benzer şekilde, float10 ^ 309'un floaten iyi doubletemsili, 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 floatiçin değerin temsilini doublenadiren ö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 floatiçin 10 ^ 40 temsilini doubleirade verimi double10 ^ 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.