我有一个采用纬度和经度的模型但由于某种原因,当创建模型时,它会将纬度/经度四舍五入到小数点后2位而不是保存整个值,例如-81.39522999999997保存为-81.39000000000000如何我能解决这个问题吗?
我的模特是
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)这是我第一次使用小数..
答案 0 :(得分:6)
您需要转到初始化实体表的Context类。
public DbSet relistings {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
}
重新显示是小数所在的模型的名称然后在场外x =&gt; x.mydecimal是你想要的十进制属性然后具有精确度你输入的准确度你想要的东西要......工作喜欢魅力
答案 1 :(得分:2)
在我的情况下,我使用实体框架将其翻译为十进制(来自SQL Server Decimal(9,6)
,因为这似乎高达0.1米。
纬度/经度并不需要接近精度为double的任何地方。
无论如何,我可以通过在我的纬度/经度属性上加DisplayFormatAttribute
来对抗MVC:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = {0:0.######})]
答案 2 :(得分:1)
如果您需要这种精确度,请使用double
代替decimal
:
public double? longit { get; set; }
十进制为金钱,双重为科学。既然你在这里做科学(计算纬度和经度)而不是处理金钱,你最好使用正确的数据类型。
答案 3 :(得分:0)
旧帖子,但是当我将更新的货币汇率保存到数据库时只有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);
}
}