Десятичное число mvc3 округляется до 2 знаков

У меня есть модель, которая принимает широту и долготу, но по какой-то причине, когда модель создается, она продолжает округлять широту/долготу до 2 знаков после запятой вместо сохранения всего значения, например, это -81,395229999999997 сохраняется как -81,390000000000000, как я могу исправить это?

моя модель

public decimal? longit { get; set; }

вид

@Html.HiddenFor(model => model.longit, new {@Value = "-81.39522999999997" })

и мой MSSQL для этого сохраняется как longit Decimal (16,14)

и быстрый вопрос 16,14 означает 2 цифры слева и 14 справа, если у меня есть долгота 103,39522999999997, будет ли это стоить ошибки? так как это будет (16,13), я впервые работаю с десятичными знаками..


person user1949387    schedule 23.01.2013    source источник


Ответы (4)


Привет всем, я научился это делать .. если вы когда-нибудь подумаете об этом

  1. вам нужно перейти в свой класс Context, где вы инициализируете свои таблицы сущностей.

    публичные повторные списки DbSet { get; установлен; } похоже на то, что вы пишете этот код

    public class mycontext : DbContext
    {
    public DbSet<relisting> relistings { get; set; }
    //this is the code you write
     protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<relisting>().Property(x => x.latit).HasPrecision(16, 14);
        modelBuilder.Entity<relisting>().Property(x => x.longit).HasPrecision(16, 14);
    
    }
    //ends here
       }
    

relisting — это имя модели, в которой находится десятичное число, затем, конечно, x=>x.mydecimal — это десятичное свойство, которое вам нужно, а затем с точностью, которую вы указываете, насколько точным вы хотите, чтобы все было.. работает любит очарование

person user1949387    schedule 24.01.2013

В моем случае я использовал структуру сущностей, которая перевела ее в десятичную (из SQL Server Decimal(9,6), так как это кажется до 0,1 м.

широта/долгота не нуждаются в точности двойной точности.

Во всяком случае, я смог бороться с MVC здесь, поставив DisplayFormatAttribute в свои свойства широты/долготы:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = {0:0.######})]
person m.t.bennett    schedule 02.02.2016

Используйте double вместо decimal, если вам нужна такая точность:

public double? longit { get; set; }

Десятичная для денег, двойная для науки. Поскольку вы занимаетесь здесь наукой (вычислением широты и долготы), а не имеете дело с деньгами, вам лучше использовать правильный тип данных.

person Darin Dimitrov    schedule 23.01.2013
comment
Согласно MSDN, это не так. . decimal подходит всякий раз, когда требуется 28-значная точность (и диапазон) с минимальными ошибками округления. - person HABO; 24.01.2013
comment
Я думаю, что Даринс указывает, что десятичная дробь - это 2 знака после запятой, если она предназначена для $$$. - person Dave Alperovich; 24.01.2013
comment
@DaveA - Мой компилятор должен быть сломан: decimal foo = 1m / 7m; -- Result: 0.1428571428571428571428571429M. У OP может быть проблема с форматированием вывода, но decimal справится с задачей. - person HABO; 24.01.2013
comment
тогда я бы сказал, что лучше скрыть html-разметку. HiddenFor имеет тенденцию форматировать свои данные в соответствии с ожидаемыми типами. - person Dave Alperovich; 24.01.2013
comment
Десятичные для денег, двойные для науки Я не могу понять, насколько неправильно это предложение. Десятичное число подходит, когда требуется высокая, точная, высокая точность, и вы беспокоитесь о сложных ошибках. Двойной только тогда, когда требуется высокая точность при небольших количествах; Чем больше становится двойник, тем больше он теряет точность. Десятичная дробь сохраняет свою точность независимо от числа. - person Immortal Blue; 13.07.2015

Старый пост, но меня это тоже какое-то время смущало, когда обновленные курсы обмена валют сохранялись в базу данных только с 2 знаками после запятой (что, оказывается, по умолчанию). Я использую отображение модели для сущностей, которые можно установить следующим образом: -

public class CurrencyMapping : EntityTypeConfiguration<Currency>
{
    public CurrencyMapping()
    {
        HasKey(x => x.Id);
        Property(x => x.Id).IsRequired();
        // .HasPrecision(precision, scale)
        // 'precision' is the total number of digits the db will store,
        // regardless of where the decimal point falls 
        // 'scale' is the number of decimal places that will be stored
        Property(x => x.Rate).IsRequired().HasPrecision(16, 6);
    }
}
person RickL    schedule 07.04.2018