我正在使用现有的SQL Server数据库,其表列定义为decimal(4,2)
。但是,我被要求阻止代码舍入小数位。
所以我尝试将列类型更改为decimal
,它会自动转换为decimal(18, 0)
,这会立即清除现有值的任何小数部分。 (很好。默认的十进制类型是一个整数。重点是什么?)
所以我尝试将列类型更改为decimal(8,5)
。由于十进制之后的5位数超过了需要,因此消除了舍入问题。
但是,每当我在C#ASP.NET应用程序中打印此值时,它总是以十进制后的5位数格式化(例如12.34000
)。我不明白这一点。当我从数据库中读取值时,我将其分配给常规decimal
值。那么decimal
值如何“知道”小数点后应该有5位数?
更重要的是,如何在没有尾随零的情况下显示此值?我猜有一种格式化值的方法。但是,由于它在许多地方使用,如果它不会自动附加尾随零,会好得多。如果需要,我可以更改数据库中的数据类型。
答案 0 :(得分:3)
我将数据库列更改为float
,并将C#变量类型设置为double
。
问题解决了。
答案 1 :(得分:2)
您应该考虑在表示层而不是数据层中格式化您的货币。 通常,您希望将货币值存储在十进制(10,18)字段中。您可以检索十进制值并将其格式化为csharp中的表示,如str = String.Format(“{0:C}”,myDecimalValue);
答案 2 :(得分:1)
十进制将始终以尾随零返回。按照惯例 - 尾随零表示有效位数。
在您的情况下,十进制(8,5)表示该数字总共有8位数,其中5位在小数点后面。
试试此Select CAST (1 as decimal (8, 5))
将返回1.00000
由于这意味着小数点前只有3位数,因此以下语句Select CAST (1000 as decimal (8, 5))
会给您一个错误Arithmetic overflow error converting int to data type numeric.
答案 3 :(得分:1)
在控制台应用中尝试这个小片段:
decimal d1 = 12.34M, d2 = 12.3400M;
Console.WriteLine("{0} {1}", d1, d2);
Console.WriteLine("{0:0.0###} {1:0.0###}", d1, d2);
如果,您可以如何以及在何处应用格式取决于您。
答案 4 :(得分:0)
实体框架默认使用decimal(18,2)。如果你不告诉它,它不会格式化以适应 SQL Server 数据类型。
要告诉 EF 应该为每个属性执行什么 SQL 数据类型:
public class DbEntities : DbContext {
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Location>().Property(location => location.Latitude).HasPrecision(9, 6);
}
}
还有其他方法可以为所有属性执行此操作:Decimal precision and scale in EF Code First