C# SQL Server中的金钱

C# SQL Server中的金钱,c#,.net,sql-server,entity-framework-4,C#,.net,Sql Server,Entity Framework 4,Im使用实体框架作为ORM,使用SQLServer2008作为服务器 我的应用程序中有财务操作,所以我使用了money列。但当结果为例如2.99986时,它存储在数据库值2.9998中,而期望值为2.9999 有没有办法让它像math说的那样工作?如果没有,我怎么能用C#对数字进行四舍五入,这样math.round(2.99986)得到的结果是2.9998,只需将剩下的sigit切到第四位 谢谢你的帮助 我想出的唯一解决办法是将我的数字乘以10000,然后截断,再除以10000:) 还有其他更好

Im使用实体框架作为ORM,使用SQLServer2008作为服务器

我的应用程序中有财务操作,所以我使用了money列。但当结果为例如2.99986时,它存储在数据库值2.9998中,而期望值为2.9999

有没有办法让它像math说的那样工作?如果没有,我怎么能用C#对数字进行四舍五入,这样math.round(2.99986)得到的结果是2.9998,只需将剩下的sigit切到第四位

谢谢你的帮助

我想出的唯一解决办法是将我的数字乘以10000,然后截断,再除以10000:)
还有其他更好的解决方案吗?

这是数据类型的限制。看起来它会截断小数点右边第四位之后的任何内容

从MSDN-:

如果一个对象被定义为货币,它最多可以包含19位数字,其中4位可以位于小数点的右边。对象使用8个字节来存储数据。因此,货币数据类型的精度为19,刻度为4,长度为8

以及:

money和smallmoney限制在小数点后四位。如果需要更多小数点,请使用decimal数据类型


更新:


从您的评论来看,您似乎想用C#解决这个问题。在这种情况下,您可以使用其中一个重载,该重载接受符合所需舍入逻辑的枚举。

使用此重载可以有效地截断所需的精度

 Math.Round(value - 0.00005, 4, MidpointRounding.AwayFromZero));

通常,在执行财务计算时,您需要尽可能高的精度。为什么你想要更少?因为通常你不想要精确,你想要精确。你在整个企业中都是这样做的,否则你会出现分币舍入错误,这会让会计师们的脑袋爆炸。如果另一个系统正在跟踪类似的数字,精确到小数点后4位,您只需以相同的方式进行跟踪,就可以避免一个巨大的麻烦。
hello
之后的第2段和第3段发生冲突。第二个表示期望值为2.9999。第三个数字是2.9998。编辑(最后一段)说需要的是2.9998。我不需要更多的小数点。我只想知道在2.9998四舍五入后,在2.99986号C表格中使用什么方法