首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为了节省内存和保持高精度计算,将窄类型转换为宽类型是一个糟糕的想法吗?

为了节省内存和保持高精度计算,将窄类型转换为宽类型是一个糟糕的想法吗?
EN

Stack Overflow用户
提问于 2009-05-28 16:29:56
回答 10查看 551关注 0票数 5

我正在处理金融数据,所以有很多数据,需要相对高精度(64位浮点或更大的精度)。

在我的工作场所中,标准的做法似乎是将所有数据都表示为c# decimal类型,这是一个128位宽的浮点数,专门为支持无舍入的base10操作而创建。

由于64位的宽度足以保持代表性的精度,对于所有计算(mult,div,add等),将数据转换为更宽的类型,然后返回到64位,以便驻留在内存中(这是它花费时间最多的地方),这是荒谬的吗?

参考:内存在这里绝对是有限的资源。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-05-28 16:49:49

在双精度(64位)和浮点数(32位)上使用十进制(128位)通常与大小无关。这跟基地有关。double和float是浮点二进制点类型,而decimal是浮点小数点类型-正是这个特性让它精确地表示了浮点/双精度不能表示的数字,比如0.1。

在概念上,我们没有理由不使用64位的decimal类型,在许多情况下,这就足够了-但在出现这样的类型或您自己编写它之前,请不要将“较短”(和二进制浮点)类型的float/double用于财务计算。如果你这样做,你就是在自找麻烦。

如果您建议编写一个可以转换为decimal或从decimal转换为浮动decimal类型的存储类型,这听起来是一个潜在的好主意,即使它不能做任何计算。当你被要求转换一个你不能精确表示的十进制值时,你需要非常小心考虑该怎么做。老实说,我对看到这样的类型很感兴趣。嗯..。

(正如其他答案所指出的那样,在这样做之前,我真的要确保是数字占用了内存。如果您不需要这样做,那么投机性地引入额外的复杂性就没有什么意义了。)

票数 16
EN

Stack Overflow用户

发布于 2009-05-28 16:57:09

64位浮点不能保持财务数据的精度。这不是空间的问题,而是数据类型使用哪种数字系统的问题;double使用基数-2,十进制是基数-10,基数-2不能表示精确的基数-10小数,即使它有1000位的精度。

不相信我?运行以下命令:

代码语言:javascript
复制
double d = 0.0;
for (int i = 0; i < 100; i++)
    d += 0.1;
Console.WriteLine(d);

> 9.99999999999998

如果需要以10为基数的计算,则需要decimal类型。

(编辑:该死,再次被乔恩·斯基特击败...)

如果小数类型确实是瓶颈,您可以使用较长数量的便士(或1/8美分或其他单位),而不是小数美元。

票数 5
EN

Stack Overflow用户

发布于 2009-05-28 16:33:41

您应该使用分析器来查看哪些对象占用了大量内存。如果你的小数对象是罪魁祸首,那么我会说是的,去追查它们。否则,你只是在猜测。分析器肯定会告诉你的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/921858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档