Ben benzer durumlarda ileride başvurmak üzere perde arkasında neler olduğunu anlaşılmalıdır düşünüyorum.
Bilimsel gösterimi hariç ondalık basamaklı sayısal sayısal değerler, mümkün olan en küçük düzeyde saklanan ondalık veri türünü temsil eder Ondalık tipi. Transact-SQL açıklamalarda https://msdn.microsoft.com/en-us/library/ms191530%28SQL.90%29.aspx#_decimal
, ondalık basamağa sahip bir sabit otomatik asgari duyarlık ve ölçeği gerekli kullanarak, bir sayısal verileri değerine dönüştürülür: den Lieven Keersmaekers en aynısı alıntı. Örneğin sabit 12.345 5 bir hassasiyet ve ölçek belirtmek ondalık noktasının sağındaki 3.
sondaki sıfırlar bir ölçekte bir sayısal değer dönüştürülür. Ondalık noktasının solundaki sıfırlar göz ardı edilir.
Bazı örnekler:
1.0 -> Decimal(2,1)
60.0 -> Decimal(3,1)
1.00 -> Decimal(3,2)
01.0 -> Decimal (2,1)
başka nokta dikkate almak Data Type precedence olduğunu. Bir işleç, farklı veri türlerinin iki ifadesini birleştirdiğinde, veri türü önceliği kuralları, daha düşük önceliğe sahip veri türünün, daha yüksek önceliğe sahip veri türüne dönüştürüleceğini belirtir. Ve yine dikkate alınması gereken bir başka nokta ise, Ondalık türleri üzerinde elde edilen Ondalık tipi, yani doğruluk ve ölçek, hem işlenenlere hem de işlemin kendisine bağlı olarak aritmetik işlemler yaparsak yapılmasıdır. Bu, Precision, Scale, and Length numaralı belgede açıklanmıştır.
Yani, Hassas ve Ondalık ifadelerin ölçeği ilgili kuralları yukarıda kullanarak parantez
(1.0/60.0) is evaluated to 0.016666 and the resulting type is Decimal (8,6)
da ifade parçasıdır. Ayrıca bankanın yuvarlama veya yuvarlama bile kullanılır. Ondalık ve float tipi için farklı yuvarlamaların not edilmesi önemlidir. Biz ifadesini
1.0/0.016666 is evaluated to 60.002400096 and the resulting type is Decimal (17,10)
devam ederse Yani tutarsızlık parçası şamandıra için daha ondalık türleri için kullanılan farklı yuvarlama kaynaklanmaktadır. Yukarıdaki kurallara uygun olarak, parantez içinde sadece bir dökümün kullanılması yeterli olacaktır. Diğer her türlü literal, Veri Türü Öncelik kurallarına uygun olarak yüzdürülebilir.
1.0/(1.0/cast(60.0 as float))
Ve bir tane daha ÖNEMLİ şey. Bu yüzdürme ifadesi bile kesin sonucu hesaplamaz. Öyle ki, ön uç (SSMS ya da her neyse), değeri 6 saniyelik bir doğrulukla (sanırım) yuvarlar ve daha sonra sıfırları keser. Yani, 1.000001, 1 olur.
Basit değil mi?
Ah .. Şu ana kadar bu yöntemi bilmiyordum. Çok teşekkür ederim :) – VVS
Öyleyse, beklenen sonucu elde etmek için açık bir oyuncu yok mu? SQL Server'a belirli bir değişmez türün (örn.) Yüzdürme olduğunu söylemenin başka bir yolu var mı? – VVS
@VVS, zaten yaptığınız gibi açık bir dökümün yanı sıra bildiğim kadarıyla değil. SQL Server, her zaman değeri sayısal olarak yorumlar.Kendiniz 1,00000000000000000000000000000000000000 gibi değerlerinizi hassaslaştırırsanız, sorun biraz azaltılabilir. –