c# - 将窄类型转换为宽类型以节省内存并保持高精度计算是不是一个糟糕的主意?

标签 c# performance memory casting decimal

我处理的是财务数据,所以数据量很大,需要相对高精度(64 位浮点或更宽)。

我工作场所的标准做法似乎是将所有这些表示为 c# 十进制类型,这是一个 128 位宽的浮点,专门用于支持四舍五入的自由 base10 操作。

由于 64 位足够宽以保持代表性精度,将数据转换为更宽的类型以进行所有计算(mult、div、add 等)然后返回到 64 位以坐在内存中(这是在哪里?它花费最多的时间)?

供引用:内存绝对是这里的限制资源。

最佳答案

使用十进制(128 位)而不是 double (64 位)和 float (32 位)通常与大小无关。跟基地有关。 double 和 float 是 float 的 binary 点类型,而 decimal 是 float 的 decimal 点类型 - 正是这个特性让它在 float/double 不能的地方准确地表示像 0.1 这样的数字

我们没有 64 位十进制类型的概念性原因,在许多情况下这确实足够了 - 但直到出现这样的类型或您自己编写它, 不要使用“较短”(和二进制浮点)类型的 float/double 进行财务计算。如果这样做,就是在自找麻烦。

如果您建议编写一种可以与十进制相互转换并且仍然是浮点十进制类型的存储类型,这听起来可能是个好主意,即使它无法进行任何计算。如果你被要求转换一个你不能准确表示的十进制值,当你考虑该怎么做时,你需要非常小心。老实说,我有兴趣看到这样的类型。嗯……

(正如其他答案所表明的那样,在执行此操作之前,我确实会确保占用内存的是数字。如果您不需要这样做,那么推测性地引入额外的复杂性毫无意义。)

关于c# - 将窄类型转换为宽类型以节省内存并保持高精度计算是不是一个糟糕的主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/921858/

相关文章:

sql - 选择SQLite表的许多行时应用程序崩溃

c# - 在Unity C#中围绕中心点旋转

mysql - sql查询性能不佳

c# - Asp.net mvc 5 在添加内容时添加时间戳?

reactjs - 如何在 React Native 中加快应用程序启动时间

android - 减少安卓应用启动时间

python - psutil 模块在 debian 7 上无法完全工作

变量重新分配中的 C++11 内存释放

c# - Entity SQL DateDiff 函数

c# - 图像的一部分内的 WPF ScrollableViewer