2010-11-12 12 views
24

lo que parece que side fundición como decimales y el redondeo

CAST(field1 as decimal) field1 

Esto añadirá automáticamente redondeo.

el original se define como:

campo1 tipo: longitud de flotación: 8 prec: 53

tengo que echarlo a decimal, porque necesito mi capa de Entity Framework para generar este campo como decimal (en lugar de doble)

¿Hay alguna forma de convertirlo en decimal, de modo que se preserve la precisión original y no se redondee?

me gustaría evitar tener que declarar la precisión en el molde, porque 1. hay cientos de campos involucrados con precisión variable, y 1. si la tabla subyacente cambia en el futuro, podría causar errores imprevistos y 3. hace que la gestión más difícil

+0

IIRC, la precisión predeterminada para decimal es de tres cifras decimales, si no se especifica la precisión. –

Respuesta

42

¿usted ha intentado:

SELECT Cast(2.555 as decimal(53,8)) 

Esto volvería 2.55500000. ¿Es eso lo que quieres?

ACTUALIZACIÓN:

Al parecer, también se puede utilizar para encontrar SQL_VARIANT_PROPERTY la precisión y la escala de un valor. Ejemplo:

SELECT SQL_VARIANT_PROPERTY(Cast(2.555 as decimal(8,7)),'Precision'), 
SQL_VARIANT_PROPERTY(Cast(2.555 as decimal(8,7)),'Scale') 

vuelve 8|7

Usted puede ser capaz de utilizar esto en su proceso de conversión ...

+0

gracias, ¿es posible omitir declarando la precisión? conservando original? –

+0

Hmm, no que yo sepa. Déjame hurgar un poco ... –

+0

Bueno, parece que a pesar de que puedes asignar precisión y escalar a las variables, no puedes usar esas variables al declarar la precisión y la escala. Lo siento. –

2

Prueba SELECT CAST(field1 AS DECIMAL(10,2)) field1 y reemplazar 10,2 con cualquier precisión que necesita.

1
cast (field1 as decimal(53,8) 
) field 1 

El valor por defecto es: decimal (18,0)

+0

Gracias por indicarnos cuál es el valor predeterminado, pero ¿dónde lo encontraste? –

+1

@LonnieBest - https://msdn.microsoft.com/en-us/library/ms187746.aspx – JeffO