C#decimal是啥类型以及它的作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#decimal是啥类型以及它的作用相关的知识,希望对你有一定的参考价值。

在C#里decimal表示 128 位数据类型,与double相比,decimal 类型具有更高的精度和更小的范围,适合于财务和货币计算。

Decimal数据类型可以在Visual Studio编辑器中使用,只要在一个浮点类型的值后加一个大写或小写的M,则编辑器会认为这个浮点类型的值是一个Decimal类型。

这种128位高精度十进制数表示法通常用在财务计算中。要注意的是,在.NET环境中,计算该类型的值会有性能上的损失,因为它不是基本类型。

扩展资料:

相关的类型转换:

1、整型将被隐式转换为decimal类型:计算结果为decimal。 可以使用整数文本初始化十进制变量而不使用后缀,如下所示:decimal myMoney = 300;

2、在浮点型和 decimal 类型之间不存在隐式转换:必须使用强制转换以在这两个类型之间转换。例如:decimal myMoney = 99.9m;double x = (double)myMoney;myMoney = (decimal)x。

3、还可以在同一表达式中混合使用 decimal 和数值整型。但是,不进行强制转换就混合使用 decimal 和浮点型将导致编译错误。

参考资料来源:百度百科-c#

参考资料来源:百度百科-Decimal

参考技术A decimal在sql server里是精确值类型,精度38;
在C#里是表示 128 位数据类型。double相比,decimal 类型具有更高的精度和更小的范围,它适合于财务和货币计算。

decimal:
有效位:±1.0 × 10(-28次方) 到 ±7.9 × 10(28次方)
精度:28 到 29 位
double:
有效位:±5.0 × 10(-324次方) 到 ±1.7 × 10(308次方)
精度:15 到 16 位
参考技术B decimal 关键字表示 128 位数据类型。同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。decimal 类型的大致范围和精度如下表所示。 参考技术C Decimal 数据类型只能在 Variant中使用,也就是说,不能声明一变量为 Decimal 的类型。不过可用 Cdec 函数,创建一个子类型为 Decimal 的Variant。

C / C ++如何将3维数组存储在内存中以及遍历它的最快方法是啥

【中文标题】C / C ++如何将3维数组存储在内存中以及遍历它的最快方法是啥【英文标题】:C/C++ How a 3 dimensional array is stored in memory and what is the fastest way to traverse itC / C ++如何将3维数组存储在内存中以及遍历它的最快方法是什么 【发布时间】:2014-02-15 03:43:58 【问题描述】:

我试图了解 3 维数组是如何存储在内存中的,以及 std:vector 的存储方式之间的区别。

这是我理解的存储它们的方式,和 std::vectors 的存储方式相同,不同之处在于它们充分利用了内存块 a[0][0][0] a[0][0][1] a[0][0][2]... a[0][1][0] a[0][1] [1] ... a[1][0][0] a[1][0][1]...

我的目标是找出最有效的遍历和数组方式。

例如,我有数组:

v[1000][500][3];

那么如何更高效地遍历呢?

for(i = 0; i < 1000; i++)

    for(j = 0; j < 500; j++)
    
       for(k = 0; k < 3; ++k)
       
           //some operation
       

    

或者将数组声明为更有效;

v[3][500][1000]

并遍历为

for(i = 0; i

 

是否有任何 CL 工具可以可视化数组的存储方式?

【问题讨论】:

3D 矢量是什么意思? 3维a[10][20][30] 这仍然是一个数组。在您的问题中,您区分了 3D 数组和 3D 矢量。 向量是指多个元素存储在一个内存块中。例如在数组中,一个元素存储在一个内存块中,但在一个内存块中的向量中存储多个元素,具体取决于内存块的数据类型和大小。我想知道向量的元素是否以与数组元素相同的顺序存储在内存中,以及遍历它的最有效方法是什么。 请编辑您的问题以说明您的意思。并指定您是否在谈论 std::vector 因为 std::vector 只能是一维。 【参考方案1】:

你说得对,内存中的数组表示值是连续的。所以初始化为 0 的 int v[2][2][2] 看起来像:

[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]

就性能而言,您希望尽可能接近地访问数据以避免数据缓存未命中,因此首先迭代最外层维度是一件好事,因为它们彼此相邻。

在您的第一个示例中可能发生的事情是编译器可能会优化内部循环(如果满足正确的条件)并展开它,这样您就可以通过跳过分支来节省一些时间。

由于您的两个示例都已经以正确的方式迭代,我会说对其进行分析,看看哪个更快。


std::vector 还将其元素连续存储在内存中,但由于它是一维的,因此默认情况下应用局部性(前提是您不是随机迭代)。向量的好处是它们可以增长而数组不能(无论如何都是自动的)。

【讨论】:

【参考方案2】:

当内存地址是连续的(例如,编译时间数组a[][][]),遍历多维数组最有效的方法是使用a pointera[i][j][k] 实际上是 &amp;a[0][0][0]+(i*j*k + j*k + k)。因此,将指针p初始化为起始地址,然后调用*(p++)

int main() 
    int a[2][3]=1,2,3,4,5,6;
    int *p = &a[0][0];
    for( int i=0; i<6; ++i )
        cout<<*(p++)<<endl;
    
    return 0;

【讨论】:

而声明v[3][500][1000]就变成了3 * 500 * 1000字节的连续内存。因此,它在记忆中是一样的。两种解决方案的操作次数相同。【参考方案3】:

使其可见:

#include <iostream>

    int main()
    
        int a[][3] =   0, 1, 2 ,  3, 4, 5  ;
        int* p = reinterpret_cast<int*>(a);
        for(unsigned i = 0; i < 6; ++i) 
            std::cout << *(p + i);
        
        std::cout << std::endl;
        return 0;
    

显示一行主要顺序 - 请参阅:http://en.wikipedia.org/wiki/Row-major_order

有了这个,您应该逐行迭代以利用缓存。在更高维度 N 中,你会得到类似的结果,其中每个元素代表一个维度为 N-1 的数据块

【讨论】:

以上是关于C#decimal是啥类型以及它的作用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的decimal是啥类型?

我想问下SQL里的decimal是啥函数?

这段代码中的“”是啥,它的基本作用是啥?

“decimal”是啥类型的MySQL?

decimal是啥类型

c语言中studio是啥用途,以及其他跟在include后面的一些函数的作用