Dan*_*bel 5 c# memory performance casting decimal
我正在处理财务数据,所以它有很多,它需要相对高精度(64位浮点或更宽).
围绕我的工作场所的标准做法似乎是将其全部表示为c#decimal类型,这是一个128位宽的浮点,专门用于支持round-off free base10操作.
由于64位足够宽以保持代表性的精度,所以将数据转换为更宽的类型进行所有计算(mult,div,add等)然后回到64位以便坐在内存(这是它花费的地方)是荒谬的.大部分时间)?
供参考:内存绝对是限制资源.
Jon*_*eet 16
使用十进制(128位)而不是双(64位)和浮点(32位)的点通常与大小无关.这与基地有关.虽然double和float是浮点二进制点类型,但十进制是一种浮点小数点类型 - 它的特征是它可以表示精确到0.1的数字,其中float/double不能.
没有概念上的原因,为什么我们不能没有64位十进制类型,并且在许多情况下确实已经足够了 - 但是直到这样的类型出现或者你自己编写它,请不要使用"short" "(和二进制浮点)类型的float/double用于财务计算.如果你这样做,你会遇到麻烦.
如果您建议编写一个可以转换为十进制/从十进制转换的存储类型,并且仍然是一个浮点十进制类型,即使没有它能够进行任何计算,这听起来也是一个好主意.如果您曾被要求转换一个您无法准确表示的十进制值,那么当您考虑要做什么时,您需要非常小心.老实说,我有兴趣看到这样的类型.嗯...
(正如其他答案所表明的那样,我确实确定在执行此操作之前,这是占用内存的数字.如果您不需要这样做,那么推测性地引入额外的复杂性是没有意义的.)
64位浮点不能保持财务数据的精确度.它不是空间问题,而是数据类型使用的数字系统的问题; double使用base-2,decimal是base-10,base-2不能表示精确的10进制小数,即使它有1000位精度.
不相信我?运行这个:
double d = 0.0;
for (int i = 0; i < 100; i++)
d += 0.1;
Console.WriteLine(d);
> 9.99999999999998
Run Code Online (Sandbox Code Playgroud)
如果需要基数为10的计算,则需要十进制类型.
(编辑:该死的,再次被Jon Skeet殴打......)
如果十进制类型确实是瓶颈,您可以使用大量便士(或1/8美分或任何单位)而不是十进制美元.