C# 相当于VBA指数形式的C数据类型

C# 相当于VBA指数形式的C数据类型,c#,.net,vba,excel,C#,.net,Vba,Excel,我有一个旧的VBA应用程序,它生成的值类似于1.123456789123456789123456789E-28。当我在谷歌上搜索C中的等效数据类型时,我在SO中找到了这篇文章。根据这篇文章的建议,decimal数据类型在C中的大小最大。因此我使用decimal数据类型,但我发现decimal在表示VBA以指数形式表示的大值方面似乎受到限制。所以我又在谷歌上找到了这篇文章。如本文所述 非整数数值可以表示为mmmeee,其中mmm为 尾数是有效数字,eee是指数a的幂 共10人。非积分类型的最高正值

我有一个旧的VBA应用程序,它生成的值类似于1.123456789123456789123456789E-28。当我在谷歌上搜索C中的等效数据类型时,我在SO中找到了这篇文章。根据这篇文章的建议,decimal数据类型在C中的大小最大。因此我使用decimal数据类型,但我发现decimal在表示VBA以指数形式表示的大值方面似乎受到限制。所以我又在谷歌上找到了这篇文章。如本文所述

非整数数值可以表示为mmmeee,其中mmm为 尾数是有效数字,eee是指数a的幂 共10人。非积分类型的最高正值为 十进制为7.9228162514264337593543950335E+28,单精度为3.4028235E+38,双精度为1.79769313486231570E+308

这意味着双精度数据类型具有最大的值范围。所以现在我把十进制和双精度混淆了

然后我用下面的代码做了一个小实验

    double dbl = 1.123456789123456789123456789E-28;
    decimal dcl = 1.123456789123456789123456789E-28M;
    MessageBox.Show(dbl.ToString());
    MessageBox.Show(dcl.ToString());
dbl按1.123456789123456789123456789123456789E-28打印值,而dcl值更改为0.0000000000000000000001; 有人能解释一下这里发生了什么吗?在C中,用什么样的等效数据类型来表示与VBA中相同精度的大指数值?

float和double是浮点数。这意味着它们分别持有数字和指数系数,其中double是float大小的两倍。在精度很重要的情况下,例如价格,不建议使用double。 十进制是以十进制形式保存数字,带有固定点。它更精确,尤其是十进制计算。 看起来double更可能是您要找的。float和double是浮点数。这意味着它们分别持有数字和指数系数,其中double是float大小的两倍。在精度很重要的情况下,例如价格,不建议使用double。 十进制是以十进制形式保存数字,带有固定点。它更精确,尤其是十进制计算。
看起来double更可能是您想要的东西。

根据C语言规范:

以F或F作为后缀的实文本是float类型。例如,文本1f、1.5f、1e10f和123.456F都是float类型。 以D或D作为后缀的实文本是double类型。例如,文本1d、1.5d、1e10d和123.456D都是double类型。 以M或M作为后缀的实文本是十进制类型。例如,文本1m、1.5m、1e10m和123.456M都是十进制类型。 通过采用精确的 值,如有必要,四舍五入至最接近的可表示值 使用银行家四舍五入第4.1.7节。表中任何明显的刻度 除非值四舍五入或值为零,否则将保留文字 在后一种情况下,符号和刻度将为0。因此 文字2.900m将被解析为带符号0的十进制, 系数2900,标度3。 查看第三个项目符号,您可以看到短语…此文字通过获取精确值转换为十进制值。。。。您得到的值0.0000000000000000000001是您开始使用的输入文字1.123456789123456789123456789123456789E-28M的转换结果。当然,根据有关转换的第三个项目符号的第二部分对值进行四舍五入…如有必要,使用银行家四舍五入法将值四舍五入到最接近的可表示值

对于decimal,这是正确的,但是对于float或double,数据类型本身可以保留指数表示法,因此不需要转换/舍入

补充:

要进一步扩展上述内容,请参阅:

这是十进制数据类型的定义。如图所示:小数的范围为-7.9 x 1028到7.9 x 1028/100到28或28到29位有效数字。您的文字1.123456789123456789123456789E-28M超出了该限制,因此在转换时,1右侧的所有内容都将按照上述规则四舍五入

解决方案:

如果您需要比decimal提供的精度更高的精度,您可能需要研究实现自己的类,这是绝对可行的。考虑寻找BigDimple的C实现方法。 我在快速谷歌上发现了一个实现:


我不能肯定它的正确性,但它至少可以成为您的起点。

根据C语言规范:

以F或F作为后缀的实文本是float类型。例如,文本1f、1.5f、1e10f和123.456F都是float类型。 以D或D作为后缀的实文本是double类型。例如,文本1d、1.5d、1e10d和123.456D都是double类型。 以M或M作为后缀的实文本是十进制类型。例如,文字1m、1.5m、1e10m和123.456M都是ty pe十进制。 通过采用精确的 值,如有必要,四舍五入至最接近的可表示值 使用银行家四舍五入第4.1.7节。表中任何明显的刻度 除非值四舍五入或值为零,否则将保留文字 在后一种情况下,符号和刻度将为0。因此 文字2.900m将被解析为带符号0的十进制, 系数2900,标度3。 查看第三个项目符号,您可以看到短语…此文字通过获取精确值转换为十进制值。。。。您得到的值0.0000000000000000000001是您开始使用的输入文字1.123456789123456789123456789123456789E-28M的转换结果。当然,根据有关转换的第三个项目符号的第二部分对值进行四舍五入…如有必要,使用银行家四舍五入法将值四舍五入到最接近的可表示值

对于decimal,这是正确的,但是对于float或double,数据类型本身可以保留指数表示法,因此不需要转换/舍入

补充:

要进一步扩展上述内容,请参阅:

这是十进制数据类型的定义。如图所示:小数的范围为-7.9 x 1028到7.9 x 1028/100到28或28到29位有效数字。您的文字1.123456789123456789123456789E-28M超出了该限制,因此在转换时,1右侧的所有内容都将按照上述规则四舍五入

解决方案:

如果您需要比decimal提供的精度更高的精度,您可能需要研究实现自己的类,这是绝对可行的。考虑寻找BigDimple的C实现方法。 我在快速谷歌上发现了一个实现:


我不能说它是正确的,但它至少可以成为您的一个起点。

我认为,如果您进一步阅读第一篇文章,您将了解其中的差异以及何时使用它们。我想你可能误解了你发布的第一个链接。我想如果你进一步阅读第一篇文章,你就会理解它们的区别以及何时使用它们。我想你可能误解了你发布的第一个链接。