Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在对象创建过程中转换货币时C中的舍入错误_C#_Entity Framework - Fatal编程技术网

C# 在对象创建过程中转换货币时C中的舍入错误

C# 在对象创建过程中转换货币时C中的舍入错误,c#,entity-framework,C#,Entity Framework,我正在转换货币,在使用实体框架时遇到了一个奇怪的舍入问题。以下是缩写代码: var v = select new ValuationsModel { LocalValue = dv.LocalValue, CurrencyId = dv.CurrencyId, FXRate = fx.ExchangeRate, USDValue = dv.LocalValue * (dv.CurrencyId == "USD" ? 1.0m : Convert

我正在转换货币,在使用实体框架时遇到了一个奇怪的舍入问题。以下是缩写代码:

var v = select new ValuationsModel
{
    LocalValue = dv.LocalValue,
    CurrencyId = dv.CurrencyId,
    FXRate = fx.ExchangeRate,
    USDValue = dv.LocalValue * (dv.CurrencyId == "USD" ? 1.0m : Convert.ToDecimal(fx.ExchangeRate)),
}).ToList();

decimal usdValue = v.LocalValue.Value * (v.CurrencyId == "USD" ? 1.0m : Convert.ToDecimal(v.FXRate));
以下是在“快速观察”窗口中验证的所有值:

外汇兑换率为双精度

dv.CurrencyId是字符串类型

dv.LocalValue是可为空的十进制类型

fx.ExchangeRate = 1.36678
dv.CurrencyId = "GBP"
dv.LocalValue = 15102141.1994
美元价值为:20689933.443178=15102141.1994*1.37

美元价值为:20641304.548515932=15102141.1994*1.36678


为什么fx.ExchangeRate在select new语句中四舍五入到1.37,但在下面完全相同的计算中没有四舍五入?我甚至在第二份作业中复制了货币支票,以确保这不会影响工作。如果我想要精度,我是否必须在select new语句之外进行计算?

十进制和双精度具有不同的精度级别。请参阅和。这与计算机在处理浮点运算方面的局限性以及速度与高精度之间的权衡有关。

dv.LocalValue也是十进制的吗?请显示相关的类定义ValuationModel以及fx的任何类型。我的钱是用不同的类型来存储十进制值。@Legion我们宁愿复制和粘贴最小的类定义,也不必自己编写它们来重现问题。再说一次。。这是SQL错误。。。他在问题中没有提到这一点,但他正在使用EF。。现在选择。。。。未在C端执行,但已转换为SQL。。。现在很容易想象转换。到指定。。。被翻译成类似CAST的东西。。。作为小数x,Y,那么如果Y是2,结果是明显的。。。如果他正在使用SQLite,这甚至是最糟糕的,因为那里没有十进制数据类型。。。因此,解决方案是在C端实现结果并进行计算,而坏的做法是在与currencyfx exchange rate连接时将某些内容存储为double/real。这与十进制和double的相对精度无关。问题是,同一计算从相同的值产生两个不同的结果。@Legion:如果使用的类型不同,则不是相同的计算。如果您查看底层二进制,则双精度和小数的表示方式完全不同,因此使用双精度和小数进行的任何计算都是不同的。@更平坦的是,两种计算中的相对类型是相同的。USDValue=decimal类型的dv.LocalValue乘以转换为decimal的double类型的fx.exengagerate。usdValue=v.LocalValue.decimal类型的值乘以转换为decimal的double类型的v.FXRate。