Entity Framework中用Double类型保存两位小数价格的实现方法
问题:Entity Framework中使用double类型保存两位小数格式的价格
我正在使用Entity Framework创建包含商品的数据库,商品实体包含名为Preis(价格)的字段,希望将所有价格以两位小数形式保存,即使是整数也要显示为如2=2.00、5.9=5.90、17.99=17.99的格式,且无法使用Decimal类型。以下是我的Produkt实体代码:
namespace CashRegister.Models { public class Produkt { [Key] public int Id { get; set; } public string Name { get; set; } public double Preis { get; set; } public bool Preisart { get; set; } public bool Deaktiviert { get; set; } = false; public List<EinkaufsPosition> EinkaufsPositionen { get; set; } public int KategorieId { get; set; } public Kategorie Kategorie { get; set; } } }
请问是否可以按上述要求保存到数据库,以及如何实现?
解决方案
可以实现,核心思路是在实体层确保值被处理为两位小数,同时通过EF配置让数据库字段存储为固定两位小数的类型,最后在显示时格式化输出,具体步骤如下:
1. 实体层处理价格值,确保为两位小数
修改Preis属性的setter,使用Math.Round将传入的值四舍五入到两位小数,避免浮点数精度偏差:
namespace CashRegister.Models { public class Produkt { [Key] public int Id { get; set; } public string Name { get; set; } private double _preis; public double Preis { get => _preis; // 使用MidpointRounding.AwayFromZero确保四舍五入规则符合常规价格计算 set => _preis = Math.Round(value, 2, MidpointRounding.AwayFromZero); } public bool Preisart { get; set; } public bool Deaktiviert { get; set; } = false; public List<EinkaufsPosition> EinkaufsPositionen { get; set; } public int KategorieId { get; set; } public Kategorie Kategorie { get; set; } } }
2. 配置EF让数据库字段存储为固定两位小数类型
在DbContext的OnModelCreating方法中,通过Fluent API将Preis字段映射到数据库的decimal(18,2)类型(虽然实体用double,但数据库用decimal类型能避免浮点数存储的精度丢失,EF会自动处理类型转换):
using Microsoft.EntityFrameworkCore; using CashRegister.Models; public class YourDbContext : DbContext { public DbSet<Produkt> Produkte { get; set; } // 其他DbSet... protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Produkt>() .Property(p => p.Preis) .HasColumnType("decimal(18,2)") // 数据库存储为两位小数的decimal类型 .IsRequired(); // 根据需求可选,标记为必填字段 } // 其他DbContext配置... }
3. 显示时格式化输出为两位小数
无论存储的值如何,在界面、日志或其他输出场景中,使用ToString("F2")格式化价格,确保显示为两位小数格式:
// 示例:控制台输出 Produkt produkt = db.Produkte.First(); Console.WriteLine($"价格:{produkt.Preis.ToString("F2")}"); // 示例:ASP.NET MVC视图中输出 @Model.Preis.ToString("F2")
内容的提问来源于stack exchange,提问作者Wiiscord
相关产品推荐
相关产品推荐

