在C#交互中运算,如下:
(float)94600.02 + (float)106000.00
200600.031
(double)94600.02 + (double)106000.00
200600.02000000002
(decimal)94600.02 + (decimal)106000.00
200600.02
94600.02 + 106000.00
200600.02000000002
我对这个不太懂为什么会这样,求大佬讲解,如何实现高精度运算,因为是用于财务计算。
作财务运算只能用decimal。下面是摘自MSDN的说明:
Decimal 值类型表示从正 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。Decimal 类型不会消除对舍入的需要,而是将因舍入而导致的错误降到最少。例如,下面的代码产生结果 0.9999999999999999999999999999 而不是 1。
decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor);
只有decimal 是精準浮點數,可以用來做金錢運算
其餘float, double 都是運算浮點數,都會有小數點的運算誤差
運算時也不應該混用不同型別,統一轉換成decimal 再做運算才能保證精準
decimal也是不精确的?原因是有些十进制的数的小数部分不能找到一个长度合适的二进制数表示,需要舍弃一部分。计算机存的是二进制数。
你如果想精确计算,可以把参与运算的数据定义为decimal,decimal是个类,内部比较复杂,我没看过,你有兴趣看下。
float, double属于浮点数,会存在精度损失的,千万别用在计算财务。decimal是高精度类型,一般用于财务计算,精度最高,但是存储位数低于double,不过计算财务也够了