我一直看到人们在C#中使用双打.我知道我读到某个地方,双打有时会失去精确度.我的问题是什么时候应该使用双倍,何时应该使用小数类型?哪种类型适合货币计算?(即超过1亿美元)
问题摘要:
对于某些十进制值,当我们将类型从十进制转换为double时,会将一小部分添加到结果中.
更糟糕的是,可能存在两个"相等"的十进制值,这些值在转换时会产生不同的双精度值.
代码示例:
decimal dcm = 8224055000.0000000000m; // dcm = 8224055000
double dbl = Convert.ToDouble(dcm); // dbl = 8224055000.000001
decimal dcm2 = Convert.ToDecimal(dbl); // dcm2 = 8224055000
double dbl2 = Convert.ToDouble(dcm2); // dbl2 = 8224055000.0
decimal deltaDcm = dcm2 - dcm; // deltaDcm = 0
double deltaDbl = dbl2 - dbl; // deltaDbl = -0.00000095367431640625
Run Code Online (Sandbox Code Playgroud)
查看评论中的结果.结果从调试器的手表中复制.产生这种效果的数字的十进制数字远远少于数据类型的限制,所以它不能是溢出(我猜!).
更有趣的是,可以有两个相等的十进制值(在上面的代码示例中,参见"dcm"和"dcm2","deltaDcm"等于零),在转换时产生不同的双精度值.(在代码中,"dbl"和"dbl2",它们具有非零"deltaDbl")
我想它应该是与两种数据类型中数字的按位表示的差异相关的东西,但是无法弄清楚是什么!而且我需要知道如何按照我需要的方式进行转换.(比如dcm2 - > dbl2)