2013-04-17 23 views
5

Bir ara değişkene atamadan bir tam sayıdan kayan nokta değerine nasıl dönüştürüleceğini bilmek isterim. Söz konusu kod şuna benzer: Bu açıkça zamanında başarısızBir tamsayı değişkene atamadan kayan nokta değerine en iyi nasıl dönüştürebilirim?

Format('Theoretical peak scaling %6.2f', [ThreadCount]) 

ThreadCount bir tam sayıdır çünkü.

ben bariz

Format('Theoretical peak scaling %6.2f', [Double(ThreadCount)]) 

denenmiş ve derleyici

E2089 Invalid typecast 

ile ben

Format('Theoretical peak scaling %6.2f', [ThreadCount*1.0]) 

yazabilirsiniz biliyorum reddeder ama bu kötü okur ve sadece bir geleceği teşvik edecek çarpan, çarpanı yanlışlıkla kaldıracak.

Ara değişken olmadan bunları yapmanın temiz bir yolu olduğunu bilen var mı?

+0

Sadece merak etmek gerekirse, neden bir değişken kullanmak istemiyorsunuz? –

+0

@Toon Çünkü isim vermeliyim. Yani şimdi temelde aynı isim ve aynı değerle iki yerel değişkenim var. Kod, değişken olmadan daha iyi okunur. –

+0

Ara değerler kullanmayı tercih ederim. Liste çok uzun sürüyorsa, işlevi bölme zamanıdır. Ancak isimlendirme konusu da üzerinde düşünmeye değer. –

cevap

4

Akademik ve ben de bir fonksiyon veya * 1,0 kullanmayı tercih ediyorum ama bu Bu belki saçma hissediyor

Format('Theoretical peak scaling %6.2f', [Double(Variant(ThreadCount))]) 
+0

Aferin. Gözlerimi biraz kanıyor! ;-) –

+5

benim de, hiç kullanmam. – bummi

+2

'+ 0.0' kullanırdım - genellikle ekleme çarpma işleminden daha kolaydır: -D –

3

basit bir işlev kullanılamaz:

function IntToDouble(const AInt: Integer): Double; 
begin 
    Result := AInt; 
end; 


Format('Theoretical peak scaling %6.2f', [IntToDouble(ThreadCount)]); 
+0

Kötü yazım hatası ... ;-) –

+0

Bu kesinlikle temiz bir yaklaşım. Dile ya da belki de RTL'ye inşa edilmiş bir şey olmasını umuyordum. Böyle bir şey olmayacak diye şaşırtıcı görünüyor. Türler arası dönüştürme böyle temel bir görevdir. –

+3

Uyumlu olan türler arasında dönüştürme yapmak için kod gerekmez, bu nedenle derleyiciye bunu görüntülemek istediğinizi söylemek için bir yazım yöntemi kullanmak çok kolaydır. Ancak uyumsuz türler arasında dönüştürme yapmak, ağır kaldırma işlemini gerçekleştirmek için çalışma zamanı desteğini gerektirir. Açık dönüşümler gerçekte olup bitenlere göre daha açık ve daha net olduğunda, dili otomatik gizli dönüşümlerle neden yüklersiniz? Varyantlar (Delphi) kişilerin otomatik gizli veri dönüşümlerini sevmediklerini kanıtladılar. – dthorpe

8

çalışır ... ama o bir tamsayı ise neden sadece değil:

Format('Theoretical peak scaling %3d.00', [ThreadCount]); 

size hiç ondalık poi sonra sıfır ama bir şey zorunda gidiyoruz gibi değil nt, değil mi?

Format('Theoretical peak scaling %3d.00', [ThreadCount]) 

Tamsayı THREADCOUNT asla herhangi kısmi bölümünü sahip oluyor, yüzden gibi verileri dizede fraksiyonel sıfır koymak ve almak gibi doğru olurdu:

+2

dang: daha hızlı yazmam gerek.: P – dthorpe

+0

Evet, bu problem çözüldü, ama aslında float'a dönüşmedi. –

+1

@DavidHeffernan ... diğer durumlar? –

3

Ayrıca böyle bir şey yapabileceğini tamsayı.

type 
    TIntHelper = record helper for Integer 
    function AsFloat : Double; 
    end; 

function TIntHelper.AsFloat: Double; 
begin 
    Result := Self; 
end; 

Format('Theoretical peak scaling %6.2f', [ThreadCount.AsFloat]) 

Bu ancak Embarcadero bazı kısıtlamalarla birlikte, XE3 şunlar eklenmiştir:;>

5

Sen içsel türleri için bir record helper kullanmak alternatif var. Sadece bir yardımcı kişinin kapsama alanı olabileceği için, Emarcadero bu özelliğin yalnızca RTL içinde kullanılması gerektiğini öne sürmektedir. Marco Cantu dan

Alıntı: biz yazmaya karşı tavsiye

  • senin

  • (biz desteklemeyen türleri için geçici bir önlem olarak bu yapmak isteyebilirsiniz rağmen) kendi Sebep, sınıf kuralı başına sadece bir yardımcı değil, aynı zamanda bu davranış değişikliğinin gelecekteki farklı derleyici mekanizmasıyla değişmesidir. , eğer bunun için varsa, geleceğin nefesini tutmayın.

Referans: On Record/Class/Type Helpers.

Güncelleme: XE4 yılında, tamsayılar, TIntegerHelper için yerleşik bir yardımcı sınıf, bir yöntemi ToDouble sahiptir. dil elemanları yerleşik RTTI kullanma


böyle çözülebilir:

Format('Theoretical peak scaling %6.2f', 
    [TValue.From<Integer>(ThreadCount).AsExtended]) 

Hemen FTR, bir kriter gösterir TValue.From<Integer>(i).AsExtended 200 iken Double(Variant(i)) hem de satır içi yardımcı i.AsFloat, karşılaştırılabilir olduğunu + kat daha yavaş.

+1

Güzel. Ben hemen .NET uzantısı yöntemleri düşündüm ama Delphi bu özelliği vardı bilmiyordum ... XE3 + sadece, benziyor? –

+0

Evet, sadece XE3, kullanışlı ancak bazı kısıtlamalarla. Cevabı ekleyeceğim. –

+0

Ah evet, bu forum konularını iyi hatırlıyorum. Veltoloji Kilisesi'nden duyurular. –

İlgili konular