You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:01:00