понедельник, 31 марта 2014 г.

Типы данных float и real (Transact-SQL)

Copy from here

http://msdn.microsoft.com/ru-ru/library/ms173773.aspx

http://en.wikipedia.org/wiki/Floating_point

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html

http://www.delphikingdom.com/asp/viewitem.asp?catalogID=374

http://www.sql.ru/forum/758492/faq-tipy-dannyh-float-i-double-neochevidnye-osobennosti-veshhestvennyh-chisel

http://dev.mysql.com/doc/refman/5.5/en/numeric-types.html

Типы данных float и real
SQL Server 2012
4 из 7 оценили этот материал как полезный Оценить эту тему
Типы приблизительных числовых данных, используемые для числовых данных с плавающей запятой. Данные с плавающей запятой являются приблизительными, поэтому не все значения из диапазона могут быть отображены точно.
Примечание Примечание
Типу real соответствует в ISO тип float(24).
Тип данных
Диапазон
Хранение
float
- 1,79E+308 — -2,23E-308, 0 и 2,23E-308 — 1,79E+308
Зависит от значения n
real
- 3,40E + 38 — -1,18E - 38, 0 и 1,18E - 38 — 3,40E + 38
4 байта
float [ (n) ]
Где n — это количество битов, используемых для хранения мантиссы числа в формате float при экспоненциальном представлении. Определяет точность данных и размер для хранения. Значение параметра n должно лежать в пределах от 1 до 53. Значением по умолчанию для параметра n является 53.
Значение n
Точность
Объем памяти
1-24
7 знаков
4 байта
25-53
15 знаков
8 байт
Примечание Примечание
В приложении SQL Server параметр n может принимать одно из двух возможных значений. Если 1<=n<=24, то параметр n принимает значение 24. Если 25<=n<=53, то параметр n принимает значение 53.
Тип данных SQL Server float[(n)] соответствует стандарту ISO для всех значений n в диапазоне от 1 до 53. Синонимом типа данныхdouble precision является тип float(53).


Значения типа float усекаются, если они преобразуются в любой целочисленный тип данных.
Если тип данных float или real нужно преобразовать в символьный тип, то, как правило, строковую функцию STR использовать удобнее, чем CAST( ). Это объясняется большими возможностями функции STR в отношении форматирования. Дополнительные сведения см. в разделах STR (Transact-SQL) и Встроенные функции (Transact-SQL).
Точность преобразования значений float, которые используют экспоненциальное представление, к decimal или numeric ограничена только 17 знаками. Любое значение с точностью, превышающей 17 знаков, округляется до нуля.

воскресенье, 30 марта 2014 г.

decimal and numeric (Transact-SQL)

Copy from Here:

http://msdn.microsoft.com/en-us/library/ms187746.aspx


decimal and numeric (Transact-SQL)

SQL Server 2012
39 out of 85 rated this helpful Rate this topic
Numeric data types that have fixed precision and scale.
decimal [ (p,s)] and numeric(p,s)]
Fixed precision and scale numbers. When maximum precision is used, valid values are from - 10^38 +1 through 10^38 - 1. The ISO synonyms for decimal are dec and dec(ps)numeric is functionally equivalent to decimal.
p (precision)
The maximum total number of decimal digits that will be stored, both to the left and to the right of the decimal point. The precision must be a value from 1 through the maximum precision of 38. The default precision is 18.
(scale)
The number of decimal digits that will be stored to the right of the decimal point. This number is substracted from p to determine the maximum number of digits to the left of the decimal point. Scale must be a value from 0 through p. Scale can be specified only if precision is specified. The default scale is 0; therefore, 0 <= s <= p. Maximum storage sizes vary, based on the precision.
Precision
Storage bytes
1 - 9
5
10-19
9
20-28
13
29-38
17


For the decimal and numeric data types, SQL Server considers each specific combination of precision and scale as a different data type. For example, decimal(5,5) and decimal(5,0) are considered different data types.
In Transact-SQL statements, a constant with a decimal point is automatically converted into a numeric data value, using the minimum precision and scale necessary. For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.
Converting from decimal or numeric to float or real can cause some loss of precision. Converting from intsmallinttinyintfloatreal,money, or smallmoney to either decimal or numeric can cause overflow.
By default, SQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. However, if the SET ARITHABORT option is ON, SQL Server raises an error when overflow occurs. Loss of only precision and scale is not sufficient to raise an error.
When converting float or real values to decimal or numeric, the decimal value will never have more than 17 decimals. Any float value < 5E-18 will always convert as 0.

Decimal precision and scale in EF Code First

Copy from Here

http://stackoverflow.com/questions/3504660/decimal-precision-and-scale-in-ef-code-first


The answer from Dave Van den Eynde is now out of date. There are 2 important changes, from EF 4.1 onwards the ModelBuilder class is now DbModelBuilder and there is now a DecimalPropertyConfiguration.HasPrecision Method which has a signature of:
public DecimalPropertyConfiguration HasPrecision(
byte precision,
byte scale )
where precision is the total number of digits the db will store, regardless of where the decimal point falls and scale is the number of decimal places it will store.
Therefore there is no need to iterate through properties as shown but the can just be called from
public class EFDbContext : DbContext
{
   protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
   {
       modelBuilder.Entity<Class>().Property(object => object.property).HasPrecision(12, 10);

       base.OnModelCreating(modelBuilder);
   }
}
Apparently, you can override the DbContext.OnModelCreating() method and configure the precision like this:
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().Property(product => product.Price).Precision = 10;
    modelBuilder.Entity<Product>().Property(product => product.Price).Scale = 2;
}
But this is pretty tedious code when you have to do it with all your price-related properties, so I came up with this:
    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        var properties = new[]
        {
            modelBuilder.Entity<Product>().Property(product => product.Price),
            modelBuilder.Entity<Order>().Property(order => order.OrderTotal),
            modelBuilder.Entity<OrderDetail>().Property(detail => detail.Total),
            modelBuilder.Entity<Option>().Property(option => option.Price)
        };

        properties.ToList().ForEach(property =>
        {
            property.Precision = 10;
            property.Scale = 2;
        });

        base.OnModelCreating(modelBuilder);
    }
It's good practice that you call the base method when you override a method, even though the base implementation does nothing.

decimal and numeric (Transact-SQL)

SQL Server 2012
39 out of 85 rated this helpful Rate this topic
Numeric data types that have fixed precision and scale.
decimal [ (p,s)] and numeric(p,s)]
Fixed precision and scale numbers. When maximum precision is used, valid values are from - 10^38 +1 through 10^38 - 1. The ISO synonyms for decimal are dec and dec(ps)numeric is functionally equivalent to decimal.
p (precision)
The maximum total number of decimal digits that will be stored, both to the left and to the right of the decimal point. The precision must be a value from 1 through the maximum precision of 38. The default precision is 18.
(scale)
The number of decimal digits that will be stored to the right of the decimal point. This number is substracted from p to determine the maximum number of digits to the left of the decimal point. Scale must be a value from 0 through p. Scale can be specified only if precision is specified. The default scale is 0; therefore, 0 <= s <= p. Maximum storage sizes vary, based on the precision.
Precision
Storage bytes
1 - 9
5
10-19
9
20-28
13
29-38
17
For the decimal and numeric data types, SQL Server considers each specific combination of precision and scale as a different data type. For example, decimal(5,5) and decimal(5,0) are considered different data types.
In Transact-SQL statements, a constant with a decimal point is automatically converted into a numeric data value, using the minimum precision and scale necessary. For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.
Converting from decimal or numeric to float or real can cause some loss of precision. Converting from intsmallinttinyintfloatreal,money, or smallmoney to either decimal or numeric can cause overflow.
By default, SQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. However, if the SET ARITHABORT option is ON, SQL Server raises an error when overflow occurs. Loss of only precision and scale is not sufficient to raise an error.
When converting float or real values to decimal or numeric, the decimal value will never have more than 17 decimals. Any float value < 5E-18 will always convert as 0.

суббота, 29 марта 2014 г.

LINQ Group and Sum table

Copy from Here:

http://social.msdn.microsoft.com/Forums/en-US/3b13432a-861e-45f0-8c25-4d54622fbfb4/linq-group-and-sum-table

schedules:
empid    hours    date    weekending
5311      4         1/3/08   1/5/2008
5311      5         1/3/08   1/5/2008
9983      1         1/3/08   1/5/2008
9983      2         1/3/08   1/5/2008
5311      3         1/7/08   1/12/2008
5311      7         1/8/08   1/12/2008
I want to generate this:
5311       1/5/2008      9
9983       1/5/2008      3
5311       1/12/2008    10

from s in db.Schedules
group s by new {s.empid, s.weekending} into g
select new { g.Key.empid, g.Key.weekending, g.Sum(s => s.hours) };
The interesting part here is that you are grouping by two key conditions.  Yet a LINQ group by operator can only group by one condition.  So what you have to do is combine the conditions into a single anonymous type.  Once you've grouped, you now have a new variable 'g' instead of 's'.  Each instance of 'g' contains one of the group key values and a collection of the items in the group.  You can then use the Sum() operator on the collection to compute the sum over the hours.