我试过相当于Michael Meadows EDIT 2,但在VB.NET中得到了不同的结果。 (具体来说两者Double
和Decimal
结果600000.0238418580。)获取浮点常量与运行时结果(和VB.NET)相同
我已确定的差与存储到float
在C#float
(Single
)除法的编译时的精度,(这似乎是更相当于VB.NET在存储到Double
时的准确性)以及当您在运行时强制执行分区时会发生什么(这两种语言都毫不意外)。
所以,THREE_FIFTHS
和vTHREE_FIFTHS
提供了asDouble
求和不同的结果:
const int ONE_MILLION = 1000000;
float THREEsng = 3f;
float FIVEsng = 5f;
float vTHREE_FIFTHS = THREEsng/FIVEsng;
const float THREE_FIFTHS = 3f/5f;
Console.WriteLine("Three Fifths: {0}", THREE_FIFTHS.ToString("F10"));
float asSingle = 0f;
double asDouble = 0d;
decimal asDecimal = 0M;
for (int i = 0; i < ONE_MILLION; i++)
{
asSingle += (float) THREE_FIFTHS;
asDouble += (double) THREE_FIFTHS;
asDecimal += (decimal) THREE_FIFTHS;
}
Console.WriteLine("Six Hundred Thousand: {0:F10}", THREE_FIFTHS * ONE_MILLION);
Console.WriteLine("Single: {0}", asSingle.ToString("F10"));
Console.WriteLine("Double: {0}", asDouble.ToString("F10"));
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10"));
Console.WriteLine("vThree Fifths: {0}", vTHREE_FIFTHS.ToString("F10"));
asSingle = 0f;
asDouble = 0d;
asDecimal = 0M;
for (int i = 0; i < ONE_MILLION; i++)
{
asSingle += (float) vTHREE_FIFTHS;
asDouble += (double) vTHREE_FIFTHS;
asDecimal += (decimal) vTHREE_FIFTHS;
}
Console.WriteLine("Six Hundred Thousand: {0:F10}", vTHREE_FIFTHS * ONE_MILLION);
Console.WriteLine("Single: {0}", asSingle.ToString("F10"));
Console.WriteLine("Double: {0}", asDouble.ToString("F10"));
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10"));
与差异在突出显示结果是:
五分之三:0.6000000000
六十万:600000.0000000000
Single:599093.4000000000
双:599999.9999886850
十进制:600000.0000000000
vThree五分之二:0.6000000000
六十万:600000.0000000000
单:599093.4000000000
双:600000.0238418580
十进制:600000.0000000000
我的问题是,你能让C#得到一个const float
表达式与运行时(和VB.NET)结果的等价物? (即产生相同的结果作为一个vTHREE_FIFTHS
THREE_FIFTHS
。)
为什么d这很重要吗?这是一个小小的差异,“float”和“double”意味着代表不精确的事情。 –