2011-11-11 38 views
7

float sütununda varsayılan hassasiyetle (53) kayıtlı 1555.4899999999998 değerine sahibim. Basit bir select yaptığımda, SSMS çıktıyı tüm kullanılabilir hassasiyetle yazdırmak yerine yuvarlar. Yazılan değerin gerçek kaydedilmiş değere eşleşmesi için float literal olarak çalışmadığından son zamanlarda benim için bazı tuhaflıklara neden oldu.SQL Server Management Studio'da kayan nokta türlerinin tam duyarlık çıktısı

Örneğin, (bu sayılar, her iki varsayılan float kesin bir dağılıma sahip olduğunu not)

declare @f1 float 
declare @f2 float 
set @f1 = 1555.49 
set @f2 = 1555.4899999999998 
select @f1, @f2 
select STR(@f1,30,15), STR(@f2,30,15) 

Çıkışlar:

Query Analyzer
1555.49 1555.49 
1555.490000000000000 1555.489999999999800 

, ilk select çıkışlar:

1555.49 1555.4899999999998 

İstediğim davranış budur Management Studio'dan alın. SSMS'nin sonuç ekranında yuvarlanmasını önlemek için bir yol var mı?

cevap

7

sayılı

SQL Server Management Studio görüntüleme amacıyla kayan nokta değeri yuvarlar; Connect suggestion to change this behavior var, ancak "By By Design" ile kapalı. Ancak, SQLCMD, osql ve Sorgu Çözümleyicisi'ni kullanmayın.

SQLCMD -E -S server -Q"SELECT CONVERT(FLOAT, 1555.4899999999998)" 
0

Float tipini ondalık türden daha çok kullanmak için bir nedeniniz var mı? Şamandıralar, fraksiyonlar olarak depolanır, bu da üzerlerinde işlemler yapılırken genellikle hafifçe yanık olmasına neden olur. Bu, yanlışlıkların bir piksel boyutundan çok daha az önemli olduğu bir grafik uygulamanız olduğunda sorun değil, ancak parayla uğraştığınız bir muhasebe uygulaması gibi bir şeyde çok büyük bir sorun.

Bir ondalık kesimin doğruluğunun, çoğu uygulamada, bir kayan noktadan alacağı hız veya boyuttaki herhangi bir faydadan daha önemli olduğunu söylemekten memnuniyet duyarım.

+1

veritabanı şeması dışında benim kontrolüm olduğunu ne yazık ki. Ben bu uygulama için float'ın kötü bir seçim olduğu konusunda% 100'lük bir anlaşma yapıyorum, ancak eğer doğru tipte olsaydı, Management Studio'da daha doğru bir temsil olmasını beklerdim. – Simon

-2

Orijinal yazımda düzenle. Bu sayfada karşılaştığımda biraz farklı bir problem çözmeye çalışıyordum. Sadece "normal" bir sayı döndürmek için bir float türü istedim, bilimsel gösterim değil.

Orijinal olarak önerilen iki dönüştürücü. Sonunda bununla yaralanın. Aşağıdaki 7, istediğiniz kadar ondalık basamak gösterecek şekilde değiştirilebilir. Değiştir ve kırpmalar, önde gelen ve sondaki sıfırlardan kurtulur.

DEĞİŞTİRDİNİZ (RTRIM (LTRIM (DEĞİŞTİRİN (STR (x, 20, 7), '0', ' ')))'', '0')

+2

Amaç, VARCHAR'a dönüştürmek değildir. Örnekteki STR() çağrıları zaten bunu yapıyor. Sorguma dönüşüm eklemek zorunda kalmadan SSMS'nin varsayılan davranışını değiştirmeyi umuyordum. Bu arada, ondalık noktadan sonraki 5 basamak da benim örneğimde bulunan değerleri ayırmak için yeterli değil. Bunun için en azından DECIMAL (28,13) gerekir. – Simon

+0

Cevabımı düzenledim. SSMS'ye hala yardımcı olmuyor. Sadece istediğim dize gösterimini döndürür. Belki de yararlı bir geçici çözüm. – user600410

İlgili konular